簡體   English   中英

使用官方C#驅動程序更新MongoDB中的嵌入式文檔

[英]Updating an embedded document in MongoDB with official C# driver

如果我有一個包含嵌入式部門的公司集合:

{ 
  "_id": 1 
  "_t": "Company", 
  "Name": "Test Company" 
  "Divisions": [ 
    { 
       "_id": 1 
       "_t": "Division", 
       "Name": "Test Division 1" 
    }, 
    { 
       "_id": 2 
       "_t": "Division", 
       "Name": "Test Division 2" 
    } 
  ] 
} 

使用官方10gen C#驅動程序時保存/更新整個部門的最佳方法是什么? (最新的0.9版本。)

我正在使用Update.AddToSetWrapped來添加Divisions,這很好用,但我也希望能夠根據它們的_id更新文檔。

例如,如果我定義以下Update方法:

public void UpdateDivision(IDivision division) 
{ 
  var mongo = MongoServer.Create(_connectionString); 
  var database = mongo.GetDatabase(_databaseName); 
  var query = Query.EQ("_id", division.CompanyId); 
  var update = Update.AddToSetWrapped("Divisions", division); 
  database.GetCollection<Company>("Company") 
          .Update(query, update, UpdateFlags.Upsert, SafeMode.True); 
} 

並稱之為:

var division = GetDivisionById(1); 
division.Name = "New Name"; 
UpdateDivision(division);

然后將一個新的Division實例添加到集合中,因為雖然“_id”仍然是1,但Name是不同的,因此它是一個唯一的文檔。

那么有什么更新整個嵌入式文檔的好方法呢?

直到我想出一個更好的解決方案,我將首先$pull原來的分區,然后用修改后的分區$addToSet 這有效,但顯然不理想,因為它執行兩個單獨的更新。

您可以使用MongoDB的位置數組修改功能一次更新數組中的整個分區,如下所示:

var division = GetDivisionById(1);
division.Name = "New Name";
// change any other properties of division you want
collection.Update(
    Query.EQ("Divisions._id", 1),
    Update.Set("Divisions.$", BsonDocumentWrapper.Create<IDivision>(division))
);

這里發生的關鍵事情是:

  1. 在Update.Set中使用“$”
  2. 由於Update.Set需要BsonValue作為其第二個參數,我們必須使用BsonDocumentWrapper來保存除法值(要創建的IDivision類型參數將序列化時的nominalType設置為IDivision,這導致寫入“_t”鑒別器)。

暫無
暫無

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

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