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 的等价物。