Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDb插入(Perl驱动程序)与mongoimport不一致_Mongodb_Mongoimport - Fatal编程技术网

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

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

我在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位(数字长)


关于如何保持_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位整数,我认为这可能是原因。。。