2016-08-01 77 views
2

從名字FindOneAndUpdate()我知道這是一個原子操作C#MongoDb FindAndUpdate(很多)

如果我想查找10個項目(限制(10))並將它們全部更新,該怎麼辦?
例如將狀態字段設置爲「進行中」?

MongoDb是原子實現的嗎? C#驅動程序中是否有一些內置功能?如果可以避免,我不想實施2PC :-) 我還有其他消費者要求提供文檔,因此我希望避免雙重處理,儘管它對我的商業案例並不重要。

動機不是使用FindOneAndUpdate() 10次是純粹網絡化(少交談,性能更好)相關。我沒有交易類行爲的要求。

數據庫和業務案例都在我的控制之下,但我被告知預計很多文檔會很快進出。

回答

0

在MongoDB中,操作僅被視爲基於每個文檔的原子。也就是說,如果使用單個更新語句更新文檔中的多個字段,您將獲得所有更新,或者在更新發生時應該查詢它們中的任何一個。這意味着影響多個文檔的更新不會對所有文檔進行原子操作,而是在文檔中是原子操作。

因爲聽起來像你擔心發送命令到服務器更高效,而不是操作是否是原子服務器端,所以可以使用BulkWriteAsync(),其中需要IEnumerable<WriteModel<TDocument>>的更新來執行服務器。

這允許您構建一個列表更新並在一個操作中執行它們到服務器。在此過程中必須小心處理失敗的寫入。看看關於here的MongoDB Docs。