2016-01-15 63 views
8

我正在使用MongoDb 2.6.10並使用C#Driver 1.9.2。該服務器具有兩臺服務器的複製組。Mongo更新響應說沒有文檔更新,但文檔存在

我的文檔是格式。 itemId是唯一的。

{ 
    "itemID": 2314, 
    "Favorites": [1, 24, 26, 34] 
} 

然後,我必須代碼刪除形式

var query = Query.EQ("itemID", itemId); 
var result = collection.Update(query, Update.Pull("Favorites", favoriteIdToRemove)); 

喜愛的每次之後,我檢查result.DocumentsAffected等於1。在一段時間後,該值回來爲0.當我自己進入MongoDB時,我可以找到與itemID匹配的文檔,並且我可以看到它試圖從陣列中刪除的favoriteId仍然存在。結果.OK是真的,並且沒有錯誤信息。

什麼可能導致此失敗?

+1

通常,問題是文檔和更新請求之間的類型不匹配。你能編輯你的問題來提供一個特定的可重複的例子嗎? – JohnnyHK

+0

問題在於它不一致的可重複性。事實上,它每兩天發生一次。這是我的確切代碼和一個示例文檔。 – Nikhil

回答

1

我不是專家,但我的猜測是寫關注點,因爲在MongoDB中寫入和更新文檔有不同級別的保證。見Write Concerns

因此,而不是使用這個method

MongoCollection.Update Method (IMongoQuery, IMongoUpdate) 

這可能是更好的使用這個method代替:

MongoCollection.Update Method (IMongoQuery, IMongoUpdate, WriteConcern) 

,並指定WriteConcern是

WriteConcern.WMajority 

這種方式更新有最高的guara NTEE。

+0

是不是所有的寫操作都在主服務器上完成? – Nikhil

+0

是的,所有寫入操作都發生在主節點上。但是,您可以指示主服務器等待確認寫入成功,直到N個副服務器已複製寫入。 –

+0

我會試試。但是,如果所有的寫入操作都在主服務器上,爲什麼要改變寫入問題會影響文檔的哪個版本? – Nikhil

0

當文檔已經存在並且與以前的文檔完全相同時,可能無需進行任何更改,因此DocumentsAffected屬性將爲0.您可以在此處查看文檔:https://docs.mongodb.org/manual/reference/method/WriteResult/#WriteResult。您可以在結果的Response屬性中看到這些屬性。

+0

除非我對上述文檔的查詢不正確,否則我肯定文檔應該刪除了最喜歡的。當我使用MongoVUE檢查文檔時,它顯示我試圖刪除的最愛。 – Nikhil

+0

如果您可以(或不可靠)創建複製品,請在jira.mongodb.org上提交SERVER標籤。 –