2012-06-27 43 views
1

我在mongo中有一個集合,我從Perl(使用MongoDb)和mongoinsert插入數據。問題是數字的數據類型變得不一致。MongoDb插入(Perl驅動程序)與mongoimport不一致

例如,在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字段一致,您還有其他建議嗎?

回答

2

MongoDB的Perl的模塊文檔對64位整數的一些信息: http://search.cpan.org/dist/MongoDB/lib/MongoDB/DataTypes.pod#64-bit_Platforms

整數大小差是依賴於語言,並且使用驅動器;動態類型語言(如Perl,PHP和Python)如果編譯爲64位,則使用64位整數,如果編譯爲32位,則使用32位整數。像Java這樣的靜態類型語言可能更具體(Int始終爲32位),但某些語言(如C)只能保證int至少爲16位(並且長度大於int且長度至少爲32位)。

因爲您使用64位Perl(使用64位整數)插入數據,所以您期望在shell查詢中看到NumberLong _ids。 32位整數實際上是NumberInt格式,但是shell沒有明確顯示這些格式。

只要索引和查詢適用,數字_ids仍然需要是唯一的。

例如,試圖插入相同的整數_id爲32位和64位將導致重複的鍵錯誤:

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的數據整合在一起。

+0

非常感謝您的回覆..這爲我澄清了一些事情...... 我擔心的是我在_id上有重複的文檔,其中一個是32位整數,另一個是64位整數,我認爲這可能是原因... –

相關問題