我在mongo中有一个集合,我在其中插入来自Perl(使用MongoDb)和mongoinsert的数据。问题是数字的数据类型变得不一致。
例如,从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字段一致,您还有其他建议吗?
答案 0 :(得分:2)
MongoDB Perl模块文档提供了有关64位整数的一些信息: http://search.cpan.org/dist/MongoDB/lib/MongoDB/DataTypes.pod#64-bit_Platforms
整数大小差异取决于您使用的语言和驱动程序;如果编译为64位,动态类型语言(如Perl,PHP和Python)将使用64位整数,如果编译为32位,则使用32位整数。像Java这样的静态类型语言可能更具体(Int总是32位)但是某些语言(如C)只能保证int至少为16位(并且long大于int且至少为32位) )。
您在shell查询中看到的NumberLong _ids是预期的,因为您使用64位Perl(使用64位整数)插入数据。 32位整数实际上是NumberInt格式,但shell没有明确显示这些整数的类型。
就索引和查询而言,数字_ids仍然需要是唯一的。
例如,尝试插入与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 }
类似地,当查询数字_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)的整数大小差异,您可以编写自己的导入脚本。 mongoimport的等价物可以使用Text::CSV_XS快速组合在一起。