1

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

4

1 回答 1

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)时整数大小的差异,您可以编写自己的导入脚本。可以使用Text::CSV_XS快速组合 mongoimport 的等价物。

于 2012-06-28T04:23:50.200 回答