使用官方C#驱动程序更新MongoDB中的嵌入式文档(深层2级)

时间:2011-06-16 17:11:27

标签: c# .net mongodb mongodb-.net-driver

我在更新文档中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。$”是否是问题所在。

1 个答案:

答案 0 :(得分:1)

我不知道这是否可行。问题的一部分是你有两个数组(ObjectBags和Objects),我只见过一个数组使用的$符号。

在任何情况下,如果遇到这样的更新问题,最好在Mongo shell中进行实验和排除故障,一旦你在那里工作,就可以将语句翻译成C#。

您始终可以传输整个文档客户端,并使用C#在本地执行更新,然后将文档保存回数据库。它不是原子的,如果你的文档很大,它会涉及更多的网络流量,但有时可能会更简单。