尝试了解重新保存先前保存的现有文档(来自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);尝试上述操作时,嵌套更改未应用于数据库。
发布于 2011-06-17 05:25:09
我已经为你的问题构建了测试:
以下是我保存到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();
}Documents类:
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; }
}https://stackoverflow.com/questions/6378496
复制相似问题