使用官方C#驱动程序更新MongoDB中的嵌入式文档(2层深)
我在更新一个文档中有两个层次的嵌入文档时遇到问题 我读过这篇文章,但是这个问题只有1层,所以语法需求可能不同 使用1.0版更新以下嵌入文档的正确语法是什么使用官方C#驱动程序更新MongoDB中的嵌入式文档(2层深),c#,.net,mongodb,mongodb-.net-driver,C#,.net,Mongodb,Mongodb .net Driver,我在更新一个文档中有两个层次的嵌入文档时遇到问题 我读过这篇文章,但是这个问题只有1层,所以语法需求可能不同 使用1.0版更新以下嵌入文档的正确语法是什么 { "_id": { "$oid": "4dfa2601dc1c791d40106a25" }, "_t": "Model", "TypeId": 1, "Title": "Some Title", "ObjectBags": [ { "_t": "ObjectBag", "_i
{
"_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));
不确定名称“ObjectBags.Objects.$”是否是问题所在。我不知道这是否可能。部分问题是您有两个数组(ObjectBags和Object),而我只见过一个数组使用$notation 在任何情况下,对于像这样困难的更新问题,最好在Mongo shell中进行试验和故障排除,一旦在那里工作,就可以将语句转换为C#
您始终可以在客户端传输整个文档,并使用C#在本地进行更新,然后将文档保存回数据库。它不是原子式的,如果您的文档非常大,它会涉及更多的网络流量,但有时做起来会简单得多。我认为Robert的评论就在这里。您正在尝试更新数组中属于数组中对象的对象。当前的更新语法不太支持这一点。您要么必须硬编码数组位置(
ObjectBags.0.Objects.0.Data
),要么必须检索并保存整个对象。使用更改整个文档客户端的替代选项,您是否建议撤回原始BsonDocument(Model),对其应用更改?我之所以问这个问题,是因为我试图保存反序列化模型,但它似乎没有遍历层次结构来保存嵌套的更改。如果在每个级别上都发生了更改,您是否会这样做?是的,要在客户端进行更改,您必须首先将整个文档拉到客户端(作为BsonDocument或反序列化到域模型类的实例中)。当您调用Save(在BsonDocument或域模型类的实例上)时,整个文档都会被保存,无论更改了什么或没有更改什么。
{
"_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"
}