我在更新文檔中2級深度的嵌入式文檔時遇到問題。使用官方C#驅動程序在MongoDB中更新嵌入式文檔(2級深度)
我已閱讀此帖子Updating an embedded document in MongoDB with official C# driver,但該問題只有1級深度,因此語法需求可能不同。
使用official 10 gen C# driver版本1.0更新以下嵌入文檔的正確語法是什麼?
{
"_id": {
"$oid": "4dfa2601dc1c791d40106a25"
},
"_t": "Model",
"TypeId": 1,
"Title": "Some Title",
"ObjectBags": [
{
"_t": "ObjectBag",
"_id": {
"$oid": "4dfa2603dc1c791d40107e48"
},
"TypeId": 4,
"Objects": [
{
"_t": "DomainObject",
"_id": {
"$oid": "4dfa2603dc1c791d40107e49"
},
"TypeId": 4,
"ParentId": {
"$oid": "4dfa2603dc1c791d40107e48"
},
"CreatedBy": "me",
"CreatedDate": "Thu, 16 Jun 2011 08:49:21 GMT -07:00",
"LastUpdatedBy": "me",
"LastUpdatedDate": "Thu, 16 Jun 2011 08:49:21 GMT -07:00",
"InactivatedDate": null,
"Data": "1`|`11536"
}
]
}
]
}
這就是我試過的,我沒有錯誤,但沒有更新。
var models = _database.GetCollection<Model>("Models");
var model = models.FindOneAs<Model>(Query.EQ("_id", new ObjectId("4dfa2601dc1c791d40106a25")));
var wspwRef = model.Objects.Find(Domain.Object.Reference);
wspwRef.Set(Domain.Field.Reference.Name, "SOME REF RM");
var query = Query.EQ("ObjectBags.Objects._id", new ObjectId("4dfa2603dc1c791d40107e49"));
var documentWrapper = BsonDocumentWrapper.Create<DomainObject>(wspwRef);
models.Update(query, Update.Set("ObjectBags.Objects.$", documentWrapper));
的documentWrapper從最近更新的對象生成以下
{
"_id" : { "$oid" : "4dfa2603dc1c791d40107e49" },
"TypeId" : 4,
"ParentId" : { "$oid" : "4dfa2603dc1c791d40107e48" },
"CreatedBy" : "me",
"CreatedDate" : { "$date" : 1308239361784 },
"LastUpdatedBy" : "me",
"LastUpdatedDate" : { "$date" : 1308239791540 },
"InactivatedDate" : null,
"Data" : "1`|`11536^|^2`|`SOME NEW TEXT"
}
不知道名字「ObjectBags.Objects。$」是否是問題或別的東西。
我認爲羅伯特的評論就在這裏。您正試圖更新屬於數組中對象的數組中的對象。目前的更新語法不是很支持這個。您必須對數組位置(ObjectBags.0.Objects.0.Data')進行硬編碼,否則您必須檢索並保存整個對象。 – 2011-06-16 18:02:34