簡體   English   中英

MongoDB更新多個文檔

[英]MongoDB update multiple documents

架構:

{
    name: String,
    available: Boolean,
    for: String
}

有“一個”:

{
    name: "a",
    available: true,
    for: ["b", "c"]
}

和“b”:

{
    name: "b",
    available: true,
    for: ["a", "b]
}

如果我更新a.available = false,我應該同時更新b.available = false。 如何更新兩個文件,並確保在更新“a”和“b”之間沒有其他進程/線程獲得“b”。

MongoDB不支持原子事務。 因此,如果您需要在第二次更新失敗時進行第一次更新“撤消自身”,那么您運氣不好。

但是,在某些有限的情況下,MongoDB確實支持隔離更新。 更新不是全部或全部,但MongoDB將保證在您寫入的過程中沒有其他人寫入該集合。

幾個主要警告:

  • 這些文件必須都在同一個集合中
  • 必須在一個查詢中指定所有更新

根據您提供的示例,您的案例可能符合條件。

以下是描述隔離更新的文檔。

基本上,當名稱為“a”或“b”時,您將要發出類似於以下內容的更新,將“available”原子設置為false:

db.blah.update({"name": {"$in": ["a", "b"]}, "$atomic": 1}, {"available": false});

如果你確實需要它,可以在mongodb之上實現這個邏輯(在你的應用程序中或者在mongo驅動程序的包裝器中更好)。

您要求隔離屬性。 實現這一目標的一種方法是使用MVCC模式。 這真是太過分了,但這是為了讓你知道如果你真的需要mongodb和一些ACID屬性你可以做些什么。

這里描述了MVCC模式的一般實現。 還有一個項目在GitHub上實現這一點,但它是一個Java項目。

您可能也會看到這個問題及其答案。 我現在的答案只是對它的總結。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM