2011-06-16 58 views
3

我在更新文檔中2級深度的嵌入式文檔時遇到問題。使用官方C#驅動程序在MongoDB中更新嵌入式文檔(2級深度)

我已閱讀此帖子Updating an embedded document in MongoDB with official C# driver,但該問題只有1級深度,因此語法需求可能不同。

使用official 10 gen C# driver版本1.0更新以下嵌入文檔的正確語法是什麼?

{ 
    "_id": { 
    "$oid": "4dfa2601dc1c791d40106a25" 
    }, 
    "_t": "Model", 
    "TypeId": 1, 
    "Title": "Some Title", 
    "ObjectBags": [ 
    { 
     "_t": "ObjectBag", 
     "_id": { 
     "$oid": "4dfa2603dc1c791d40107e48" 
     }, 
     "TypeId": 4, 
     "Objects": [ 
     { 
      "_t": "DomainObject", 
      "_id": { 
      "$oid": "4dfa2603dc1c791d40107e49" 
      }, 
      "TypeId": 4, 
      "ParentId": { 
      "$oid": "4dfa2603dc1c791d40107e48" 
      }, 
      "CreatedBy": "me", 
      "CreatedDate": "Thu, 16 Jun 2011 08:49:21 GMT -07:00", 
      "LastUpdatedBy": "me", 
      "LastUpdatedDate": "Thu, 16 Jun 2011 08:49:21 GMT -07:00", 
      "InactivatedDate": null, 
      "Data": "1`|`11536" 
     } 
     ] 
    } 
    ] 
} 

這就是我試過的,我沒有錯誤,但沒有更新。

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

var wspwRef = model.Objects.Find(Domain.Object.Reference); 
wspwRef.Set(Domain.Field.Reference.Name, "SOME REF RM"); 

var query = Query.EQ("ObjectBags.Objects._id", new ObjectId("4dfa2603dc1c791d40107e49")); 
var documentWrapper = BsonDocumentWrapper.Create<DomainObject>(wspwRef); 
models.Update(query, Update.Set("ObjectBags.Objects.$", documentWrapper)); 

的documentWrapper從最近更新的對象生成以下

{ 
    "_id" : { "$oid" : "4dfa2603dc1c791d40107e49" }, 
    "TypeId" : 4, 
    "ParentId" : { "$oid" : "4dfa2603dc1c791d40107e48" }, 
    "CreatedBy" : "me", 
    "CreatedDate" : { "$date" : 1308239361784 }, 
    "LastUpdatedBy" : "me", 
    "LastUpdatedDate" : { "$date" : 1308239791540 }, 
    "InactivatedDate" : null, 
    "Data" : "1`|`11536^|^2`|`SOME NEW TEXT" 
} 

不知道名字「ObjectBags.Objects。$」是否是問題或別的東西。

+0

我認爲羅伯特的評論就在這裏。您正試圖更新屬於數組中對象的數組中的對象。目前的更新語法不是很支持這個。您必須對數組位置(ObjectBags.0.Objects.0.Data')進行硬編碼,否則您必須檢索並保存整個對象。 – 2011-06-16 18:02:34

回答

1

我不知道這是否可能。部分問題是你有兩個數組(ObjectBags和Objects),而我只見過一個數組使用的$符號。

在任何情況下,如果遇到困難的更新問題,最好在Mongo shell中進行實驗和故障排除,一旦你得到它的工作,你可以將語句翻譯成C#。

您始終可以傳輸整個文檔客戶端並使用C#在本地執行更新,然後將文檔保存回數據庫。這不是原子性的,如果您的文檔非常大,則會涉及更多的網絡流量,但有時可能會更簡單。

+0

有了更改整個文檔客戶端的替代選項,您是否建議撤回原始BsonDocument(模型),對其應用更改? – srdemart 2011-06-16 18:06:43

+0

我問的原因是因爲我試圖保存反序列化的模型,它似乎沒有遍歷層次結構來保存嵌套的更改。如果每個級別都有變化,會不會? – srdemart 2011-06-16 18:12:15

+0

是的,要進行更改客戶端,您必須首先將整個文檔提交給客戶端(作爲BsonDocument或反序列化到您的域模型類的實例中)。當您調用Save(無論是在BsonDocument還是在您的領域模型類的實例中)時,* entire *文檔都會被保存,無論做了什麼或沒有更改。 – 2011-06-17 14:30:09

相關問題