使用MongoDB时重新保存时预期的更新行为';的官方C#驱动程序
本文关键字:更新 驱动程序 官方 新保存 MongoDB 保存 使用 | 更新日期: 2023-09-27 17:59:25
试图了解重新保存以前保存的现有文档(来自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);
尝试上述操作时,嵌套的更改未应用于数据库。
我已经为您的问题构建了测试:
以下是我保存到mongodb中的文档(深度为3级数组):
{
"_id": "4dfa48d1872b4a1a50f60033",
"NestedLevels": [
{
"Name": "Nested1",
"NestedLevels": [
{
"Name": "Nested2",
"NestedLevels": [
{
"Name": "Nested3",
"NestedLevels": []
}
]
}
]
}
]
}
我从c#加载它,用另一个值更新Name=Nested3并保存回来,之后我从mongodb更新的文档中读取,它实际上更新了。所以我猜问题出在你们代码的其他部分。
BTW:如果你需要,我可以在这里张贴完整的测试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; }
}