Обновление встроенного документа (глубиной 2 уровня) в MongoDB с использованием официального драйвера C # - PullRequest
3 голосов
/ 16 июня 2011

У меня проблемы с обновлением встроенного документа, который имеет глубину 2 уровня в документе.

Я прочитал этот пост Обновление встроенного документа в MongoDB с помощью официального драйвера C # , но эта проблема имела глубину только 1 уровень, и поэтому синтаксические потребности, вероятно, отличаются.

Каков правильный синтаксис для обновления следующего встроенного документа с использованием официального драйвера 10 поколения C # версия 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 Ответ

1 голос
/ 16 июня 2011

Я не знаю, возможно ли это.Частично проблема заключается в том, что у вас есть два массива (ObjectBags и Objects), и я когда-либо видел только нотацию $, используемую с одним массивом.

В любом случае, при таких трудных проблемах обновления, как этот, всегда лучшечтобы поэкспериментировать и устранить неполадки в оболочке Mongo, и после того, как вы ее там заработаете, вы можете перевести операторы в C #.

Вы всегда можете перенести всю клиентскую часть документа и выполнить обновления локально, используя C #, а затем сохранитьдокумент обратно в базу данных.Он не атомарный, и если ваш документ очень большой, он требует больше сетевого трафика, но иногда это может быть гораздо проще.

...