首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用MongoDB的官方C#驱动程序时重新保存时的预期更新行为

在使用MongoDB的官方C#驱动程序时重新保存时的预期更新行为
EN

Stack Overflow用户
提问于 2011-06-17 04:56:42
回答 1查看 193关注 0票数 2

尝试了解重新保存先前保存的现有文档(来自3+级别对象图)时的预期行为。更新是仅应用于顶级字段,还是尝试遍历嵌套对象的更改?

代码语言:javascript
复制
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);

尝试上述操作时,嵌套更改未应用于数据库。

EN

回答 1

Stack Overflow用户

发布于 2011-06-17 05:25:09

我已经为你的问题构建了测试:

以下是我保存到mongodb中的文档(具有3层数组深度):

代码语言:javascript
复制
{
  "_id": "4dfa48d1872b4a1a50f60033",
  "NestedLevels": [
    {
      "Name": "Nested1",
      "NestedLevels": [
        {
          "Name": "Nested2",
          "NestedLevels": [
            {
              "Name": "Nested3",
              "NestedLevels": []
            }
          ]
        }
      ]
    }
  ]

}

我正在从c#加载它,用另一个值更新Name=Nested3并保存回来,之后我从mongodb更新的文档中读取,它实际上已经更新了。所以我猜问题出在你代码的其他部分。

顺便说一句:如果你需要的话,我可以在这里贴出完整的c#测试。

更新:

测试用例:

代码语言:javascript
复制
    [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();
    }

Documents类:

代码语言:javascript
复制
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; }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6378496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档