MongoDb插入(Perl驱动程序)与mongoimport不一致
我在mongo中有一个集合,其中插入了来自Perl(使用MongoDb)和mongoinsert的数据。问题是数字的数据类型变得不一致 例如,在Perl中,我执行以下操作:MongoDb插入(Perl驱动程序)与mongoimport不一致,mongodb,mongoimport,Mongodb,Mongoimport,我在mongo中有一个集合,其中插入了来自Perl(使用MongoDb)和mongoinsert的数据。问题是数字的数据类型变得不一致 例如,在Perl中,我执行以下操作: $collection->insert({ _id => 1, value => "record 1" }); 我有一个使用mongoimport导入的JSON文件,其中包含以下行: {"_id":2,"value":"record 2"} 现在,如果我对集合进行搜索,我会得到以下结果: > db
$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位(数字长)
关于如何保持_id字段的一致性,您还有其他建议吗?MongoDB Perl模块文档中有一些关于64位整数的信息: 整数大小的差异取决于您使用的语言和驱动程序;动态类型语言,如Perl、PHP和Python,如果编译为64位,将使用64位整数;如果编译为32位,则使用32位整数。像Java这样的静态类型语言可能更具体(Int总是32位),但像C这样的一些语言只保证Int至少是16位(long比Int大,至少是32位) 您在shell查询中看到的NumberLong\u id是预期的,因为您使用64位Perl(使用64位整数)插入数据。32位整数实际上是numberprint格式的,但是shell不会显式显示这些整数的类型 就索引和查询应用而言,数字ID仍然需要是唯一的 例如,尝试插入与32位和64位相同的整数_id将导致重复密钥错误:
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 }
同样,当查询数字时,ID将匹配:
> 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)时整数大小的差异,您可以编写自己的导入脚本。通过使用,可以很快将等效的mongoimport整合在一起。非常感谢您的回复。。这为我澄清了一些事情。。。我担心的是我在_id上有重复的文档,其中一个是32位整数,另一个是64位整数,我认为这可能是原因。。。