Ожидаемое поведение обновления при повторном сохранении при использовании официального драйвера C # MongoDB - PullRequest
2 голосов
/ 17 июня 2011

Попытка понять ожидаемое поведение при повторном сохранении существующего документа (из графа объектов уровня 3+), который был ранее сохранен.Применяется ли обновление только к полям верхнего уровня или оно пытается отследить изменения вложенных объектов?

var models = _database.GetCollection<Model>("Models");
var model = models.FindOneAs<Model>(Query.EQ("_id", new ObjectId("4df7bce0dc1c792230912fda")));

// Apply various changes on multi-level object graph...

models.Save(model);

При попытке описанного выше, вложенные изменения не применяются к БД.

1 Ответ

0 голосов
/ 17 июня 2011

Я построил тест для вашей проблемы:

Вот документ, который я сохранил в mongodb (с массивом 3 уровня):

{
  "_id": "4dfa48d1872b4a1a50f60033",
  "NestedLevels": [
    {
      "Name": "Nested1",
      "NestedLevels": [
        {
          "Name": "Nested2",
          "NestedLevels": [
            {
              "Name": "Nested3",
              "NestedLevels": []
            }
          ]
        }
      ]
    }
  ]

}

Я загружаю его из c #, обновляю Name = Nested3 с другим значением и сохраняю обратно, после этого я читаю из mongodb обновленный документ, и он фактически обновился.Так что я думаю, проблема в какой-то другой части вашего кода.

Кстати: если вам нужно, я могу опубликовать здесь полный тест на c #.

Обновление:

Тестовый пример:

    [TestMethod]
    public void MongodbTest()
    {
        var mongoServer = MongoServer.Create("mongodb://localhost:27020");
        var database = mongoServer.GetDatabase("StackoverflowExamples");
        var levels = database.GetCollection("levels");
        var level1 = new Level1();

        var nested1 = new LevelX() { Name = "Nested1" };
        var nested2 = new LevelX() { Name = "Nested2" };
        nested1.NestedLevels.Add(nested2);
        var nested3 = new LevelX() { Name = "Nested3" };
        nested2.NestedLevels.Add(nested3);

        level1.NestedLevels.Add(nested1);

        levels.Insert(level1);

        var item = levels.FindOneAs<Level1>();

        item.NestedLevels[0].NestedLevels[0].NestedLevels[0].Name = 
                                         "Changed nested level 3 name";

        levels.Save(item);

        var itemAfterUpdate = levels.FindOneAs<Level1>();

        Assert.AreEqual("Changed nested level 3 name", 
            itemAfterUpdate.NestedLevels[0].NestedLevels[0].NestedLevels[0].Name);

        levels.RemoveAll();
    }

Документы классов:

public class Level1
    {
        public Level1()
        {
            Id = ObjectId.GenerateNewId();
            NestedLevels = new List<LevelX>();
        }

        [BsonId]
        public Object Id { get; set; }

        public List<LevelX> NestedLevels { get; set; }
    }

    public class LevelX
    {
        public LevelX()
        {
            NestedLevels = new List<LevelX>();
        }

        public string Name { get; set; }

        public List<LevelX> NestedLevels { get; set; }
    }
...