![](/img/trans.png)
[英]C# official MongoDB driver code for updating(replacing) inner array in document in 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))
);
這里發生的關鍵事情是:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.