文章出處

回到目錄

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

回到目錄


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()