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

时间:2012-06-27 10:15:10

标签: mongodb mongoimport

我在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字段一致,您还有其他建议吗?

1 个答案:

答案 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快速组合在一起。