2011-06-16 61 views
2

嘗試瞭解重新保存先前保存的現有文檔(來自3 +級別對象圖)的預期行爲。是僅將更新應用於頂層字段還是嘗試遍歷嵌套對象更改?在使用MongoDB的官方C#驅動程序時重新保存期望的更新行爲

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); 

當嘗試上述內容時,嵌套更改未應用於數據庫。

+0

您可以發佈完整的代碼,用文檔類和更新的一部分?我想和你一起嘗試。 – 2011-06-16 21:00:09

回答

0

我已經建造測試您的問題:

這裏是文檔,我保存到MongoDB中(與3級陣列深):

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

}

我從加載它c#,更新名稱=嵌套3與另一個值,並保存回來,之後,我正在閱讀從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; } 
    } 
+0

我一定在做錯事。發佈你的測試代碼將有助於識別我出錯的地方。謝謝! – srdemart 2011-06-16 21:49:54

+0

@srdemart:完成,看我的更新。 – 2011-06-16 21:54:53

+0

更正了我的測試,現在它的工作! – srdemart 2011-06-17 12:54:35

相關問題