1. 程式人生 > >MongoDB學習筆記~使用原生語句實現三層集合關係的更新

MongoDB學習筆記~使用原生語句實現三層集合關係的更新

回到目錄

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層的更新還沒有實現,呵呵,開發進行中...

回到目錄