MongoDb插入(Perl驱动程序)与mongoimport不一致

问题描述:

我在mongo中有一个集合,我从Perl(使用MongoDb)和mongoinsert插入数据。问题是数字的数据类型变得不一致。MongoDb插入(Perl驱动程序)与mongoimport不一致

例如,在Perl,我做的:

$collection->insert({ _id => 1, value => "record 1" }); 

和我有进口与mongoimport一个JSON文件,包含此行:

{"_id":2,"value":"record 2"} 

现在,如果我做了搜索集合,我得到以下内容:

> db.test.find() 
{ "_id" : NumberLong(1), "value" : "record 1" } 
{ "_id" : 2, "value" : "record 2" } 

有没有办法强制Perl驱动程序插入_id作为一个32位数字?或者强制mongoimport,把它写成64位(NumberLong)?

关于如何保持_id字段一致,您还有其他建议吗?

MongoDB的Perl的模块文档对64位整数的一些信息: http://search.cpan.org/dist/MongoDB/lib/MongoDB/DataTypes.pod#64-bit_Platforms

整数大小差是依赖于语言,并且使用驱动器;动态类型语言(如Perl,PHP和Python)如果编译为64位,则使用64位整数,如果编译为32位,则使用32位整数。像Java这样的静态类型语言可能更具体(Int始终为32位),但某些语言(如C)只能保证int至少为16位(并且长度大于int且长度至少为32位)。

因为您使用64位Perl(使用64位整数)插入数据,所以您期望在shell查询中看到NumberLong _ids。 32位整数实际上是NumberInt格式,但是shell没有明确显示这些格式。

只要索引和查询适用,数字_ids仍然需要是唯一的。

例如,试图插入相同的整数_id为32位和64位将导致重复的键错误:

MongoDB shell version: 2.0.6 
>  db.ints.insert({ _id: NumberInt(1) }); 
>  db.ints.insert({ _id: NumberLong(1) }); 
E11000 duplicate key error index: testing.ints.$_id_ dup key: { : 1 } 

相若方式,查询数字_ids时将匹配:

>  db.ints.insert({ _id: NumberLong(2) }); 
>  db.ints.find({_id:Number(2)}); 
{ "_id" : NumberLong(2) } 

>  db.ints.insert({ _id: NumberLong(3) }); 
>  db.ints.find({_id:Number(3)}); 
{ "_id" : NumberLong(3) } 

如果您关心使用不同驱动程序或命令(如mongoimport)的整数大小差异,则可以编写自己的导入脚本。使用Text::CSV_XS可以很快将相当于mongoimport的数据整合在一起。

+0

非常感谢您的回复..这为我澄清了一些事情...... 我担心的是我在_id上有重复的文档,其中一个是32位整数,另一个是64位整数,我认为这可能是原因... –