2016-10-10 58 views
1

我正在爲mongodb查詢返回相同的文檔(具有相同的_id)。在mongodb查詢中返回相同的文檔

db.getCollection('my-collection').find({ "my_key" : "my_value" }, { _id : 1}).toArray() 

回報:

[ 
    { 
     "_id" : ObjectId("57d8ea76cee3c6d2299890f2") 
    }, 
    { 
     "_id" : ObjectId("57d7975b5981a0a5f27e260c") 
    }, 
    { 
     "_id" : ObjectId("57d8ea76cee3c6d2299890f2") 
    } 
] 

我試圖找出原因,因爲它打亂了我們的一些腳本的結果,但找不到原因,還是這個網上的任何提及。

我們目前的猜測是它與分割集合和shard migrations有關,但是如果是這種情況,我會預料到這是一個短暫的問題,並且此查詢現在返回相同的文檔。

注:

  • 行爲都是相同的清晰度加入帶或不帶toArray()
  • Projection只,不使用projection
  • 當我們有4個相同的完整的文檔出現在結果shards,每臺運行3臺服務器(主備,備份)
+0

看看這個http://stackoverflow.com/a/11243718/5937767 – algor

+0

謝謝,但分片鍵是_id,並且是唯一的,所以我仍然沒有得到它 – marmor

回答

1

_id始終是獨一無二的,但它對碎片是獨一無二的。如果您擁有分片收集,則可能會出現跨越不同分片的多個文檔具有相同_id的情況。這可能是由於碎片之間未完成的塊遷移操作導致的孤立塊所致。

這裏https://docs.mongodb.com/v3.0/reference/command/cleanupOrphaned/

當使用_id鍵查詢,您可以安全地刪除孤立塊,mongos知道要查詢哪個碎片,所以在這種情況下,你應該只看到一個結果。但是,當使用不同的鍵進行查詢時,查詢會在所有分片上運行,因此您可以看到您看到的結果。

+0

有史以來最好的答案。 – marmor