MongoDB學(xue)習(xi)筆記~使用(yong)原生語句實現三層集合關系的更新
MongoDB的(de)文檔(dang)(dang)型數據(ju)結構使得它在(zai)存(cun)儲數據(ju)上(shang)很像JSON,在(zai)可讀(du)性方(fang)面(mian)很強,然而這(zhe)種復雜的(de)結構在(zai)update時相對麻煩一些,而對于官方(fang)給(gei)出的(de)文檔(dang)(dang)說的(de)也不夠(gou)細致(zhi),有些東(dong)西也是(shi)(shi)模棱兩可的(de)態(tai)度(du),對于多層(ceng)嵌(qian)套(tao)的(de)集合對象(xiang),實現(xian)update更(geng)是(shi)(shi)麻煩,而目(mu)前我們所(suo)驗證的(de)是(shi)(shi),原生語句(ju)最(zui)多支(zhi)持三層(ceng)集合對象(xiang),層(ceng)次再多就無法實現(xian)了(le)。
三層(ceng)(ceng)集(ji)合(he)關系對(dui)象代碼(ma)如下,其實是內嵌兩層(ceng)(ceng),算上實體,共三層(ceng)(ceng)集(ji)合(he)
對(dui)于(yu)這種結構,我們使用原生的(de)(de)語句是可以對(dui)OrderDetail這個層(ceng)次的(de)(de)對(dui)象進行更新的(de)(de),下面(mian)是我的(de)(de)做(zuo)法
1 通過三級(ji)(ji)(ji)id查詢一級(ji)(ji)(ji)大對象(Query.EQ)(包括所(suo)有二級(ji)(ji)(ji)和三級(ji)(ji)(ji))
var query = Query.EQ("OrderList.OrderDetail._id", threeID);
2 通(tong)過(guo)SetFields過(guo)濾(lv)多余的二級對(dui)象
var oo = mongoRepository.Collection.Find(query).SetFields("OrderList.$").FirstOrDefault();
3 對象查詢出(chu)來后(hou),三級對象列表只能通過遍歷(li)的(de)方法查詢出(chu)來,并對它進行賦值更新
for (int i = 0; i < orderDetail.Count; i++) { if (orderDetail[i].Id == threeID) { orderDetail[i].ProductName = "大占(zhan)占(zhan)修改(gai)了(le)訂單 2015-09-21"; break; } }
好(hao)了(le),說(shuo)話了(le)步驟,再(zai)來看一下完整的代碼
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 = "大占占修改了訂(ding)單 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","大叔(shu)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; } }
最后的(de)(de)(de)結果是我們希望(wang)看到的(de)(de)(de),性能比之前(qian)的(de)(de)(de)版本少(shao)了一層(二(er)次分類)遍歷(li),可(ke)以接受!
就大叔的性格來說,MongoDB的嵌(qian)套更新(xin)還會(hui)在研究,開發還會(hui)在繼(ji)續(xu),因為向4層的更新(xin)還沒有實現,呵呵,開發進行中...