2010-12-07 76 views
5

嵌入文檔如果我有一個公司集合包含嵌入式部門:更新MongoDB中官方C#驅動

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

什麼是使用official 10gen C# driver時保存/更新整個事業部的最佳方式? (最新的0.9版本)

我正在使用Update.AddToSetWrapped添加Divisions,並且工作正常,但我也想能夠根據他們的_id更新文檔。

例如,如果我定義了以下更新方法:

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); 

然後司的新實例將被添加到組,因爲雖然「_id」仍然是1,名稱不同,因此它是一個獨特的文檔。

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

直到我想出了一個更好的解決方案我先去$pull原來的司然後用$addToSet跟改了司。這有效,但顯然不是理想的,因爲它執行兩個單獨的更新。

回答

11

你可以使用的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需要一個BsonValue作爲它的第二個參數,所以我們必須使用BsonDocumentWrapper來保存除數值(創建IDivision類型參數將序列化時設置nominalType到IDivision導致「_t」鑑別器被寫入)。
相關問題