2012-07-27 120 views
1

我有一個奇怪的問題查詢mongo ..我插入一堆這樣的記錄;Mongodb查詢間歇性失敗

{ 
 "_id" : "1f0aad54-85ef-446c-a02b-76bb0235e49c", 
 "internalId" : new BinData(3, "VP0LH++FbESgK3a7AjXknA=="), 
 "Data" : [ 
     ["otherId", "5e3b3293-ec93-469a-ba46-101a1feb1155"], 
     ["test", "test"], 
     ["test2", "test2"] 
    ] 
} 

然後我做一個簡單的查詢;

db.testCollection.find("Data.otherId" : "5e3b3293-ec93-469a-ba46-101a1feb1155") 

otherId是一個.net guid.ToString() - 顯然有幾個隨機的..有時這些返回。有時候他們沒有。 db.find()顯示它們,但顯式查詢它似乎隨機返回0行。

我無法解釋爲什麼這些會間歇性地無法通過查詢發現。我已經在我的分片集羣和我的本地實例,這只是香草開箱測試這一點。

有沒有人遇到過這個?

+0

在你的mongo shell上試試這個查詢並告訴我輸出db.testCollection.find(Data.otherId:「5e3b3293-ec93-469a-ba46-101a1feb1155」) – user1071979 2012-07-27 21:04:05

回答

1

您正在使用錯誤的選擇器。如果您的數據是:

{ 
    "_id" : "1f0aad54-85ef-446c-a02b-76bb0235e49c", 
    "internalId" : new BinData(3, "VP0LH++FbESgK3a7AjXknA=="), 
    "Data" : { 
     "otherId" "5e3b3293-ec93-469a-ba46-101a1feb1155", 
     "test": "test", 
     "test2": "test2" 
    } 
} 

該選擇是正確的,但你有數組,所以你應該使用這個選擇:

db.testCollection.find({"Data.0" : ["otherId","5e3b3293-ec93-469a-ba46-101a1feb1155"]}) 

(我只是測試它)

+0

如果選擇器錯誤,爲什麼它會是間歇性的? – scipilot 2017-06-06 13:13:46

+0

我不知道。我對mongodb一無所知,我相信它也發生了很大的變化。 – noob 2017-06-15 14:41:12

0

我同樣的問題,事實證明這與Mongo無關,而是在調用Node.js應用程序中的異步競爭條件。

我無意中使用過程風格只是一個執行的路徑,以便插入和選擇查詢沒有被在我想象中的順序運行。插入是異步的,但是select在外部方法中運行,而不是在回調中運行。有時插入確實首先到達那裏,可能是由於Node中tick機制的一些怪癖。

在C#中,我認爲async/await模式不太容易犯這種錯誤,因爲更明確的await語法,它實際上導致程序外觀的代碼,並且不依賴於嵌套回調。但也許它仍然可能像我一樣愚蠢。