文章出處
文章列表
MongoDB的文檔型數據結構使得它在存儲數據上很像JSON,在可讀性方面很強,然而這種復雜的結構在update時相對麻煩一些,而對于官方給出的文檔說的也不夠細致,有些東西也是模棱兩可的態度,對于多層嵌套的集合對象,實現update更是麻煩,而目前我們所驗證的是,原生語句最多支持三層集合對象,層次再多就無法實現了。
三層集合關系對象代碼如下,其實是內嵌兩層,算上實體,共三層集合
對于這種結構,我們使用原生的語句是可以對OrderDetail這個層次的對象進行更新的,下面是我的做法
1 通過三級id查詢一級大對象(Query.EQ)(包括所有二級和三級)
var query = Query.EQ("OrderList.OrderDetail._id", threeID);
2 通過SetFields過濾多余的二級對象
var oo = mongoRepository.Collection.Find(query).SetFields("OrderList.$").FirstOrDefault();
3 對象查詢出來后,三級對象列表只能通過遍歷的方法查詢出來,并對它進行賦值更新
for (int i = 0; i < orderDetail.Count; i++) { if (orderDetail[i].Id == threeID) { orderDetail[i].ProductName = "大占占修改了訂單 2015-09-21"; break; } }
好了,說話了步驟,再來看一下完整的代碼
var threeID = ObjectId.Parse("55c012232683c8143c3b494d"); var mongoRepository = new MongoDB.Data.Core.MongoOfficialRepository<Person>(); var query = Query.EQ("OrderList.OrderDetail._id", threeID); var oo = mongoRepository.Collection.Find(query).SetFields("OrderList.$").FirstOrDefault(); var update = new UpdateDocument(); var OrderInfo = oo.OrderList.FirstOrDefault(); var orderDetail = OrderInfo.OrderDetail; for (int i = 0; i < orderDetail.Count; i++) { if (orderDetail[i].Id == threeID) { orderDetail[i].ProductName = "大占占修改了訂單 2015-09-21"; #region 先pull,再push //update = new UpdateDocument {{ "$pull", // new BsonDocument("OrderList."+j+".OrderDetail", // new BsonDocument("_id",threeID)) // }}; //mongoRepository.Collection.Update(query1, update); //update = new UpdateDocument {{ "$push", // new BsonDocument("OrderList."+j+".OrderDetail", // new BsonDocument(od[i].ToDictionary())) // }}; //mongoRepository.Collection.Update(query1, update); #endregion #region 直接set update = new UpdateDocument {{ "$set", new BsonDocument("OrderList.$.UserName","大叔2015-09-21") }}; mongoRepository.Collection.Update(query, update); update = new UpdateDocument {{ "$set", new BsonDocument("OrderList.$.OrderDetail."+i, new BsonDocument(orderDetail[i].ToDictionary())) }}; mongoRepository.Collection.Update(query, update); #endregion break; } }
最后的結果是我們希望看到的,性能比之前的版本少了一層(二次分類)遍歷,可以接受!
就大叔的性格來說,MongoDB的嵌套更新還會在研究,開發還會在繼續,因為向4層的更新還沒有實現,呵呵,開發進行中...
文章列表
全站熱搜