在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/數(shù)據(jù)庫  網(wǎng)絡(luò)安全/ mongoose里面的population 與 mongodb aggregat

mongoose里面的population 與 mongodb aggregate的$lookup相比,誰的性能更好?

想問的三個(gè)問題

1.mongoose population的實(shí)現(xiàn)邏輯是什么?是封裝了很多find,然后使用DBRefs模式進(jìn)行查詢的嗎?
2.mongodb aggregate 是不是只查詢IO了數(shù)據(jù)庫一次?它的$lookup方法比起傳統(tǒng)的 DBRefs ,在做多表關(guān)聯(lián)查詢時(shí),是好還是快?為什么?
3.有沒有什么辦法可以監(jiān)控程序?qū)τ趍ongodb的讀寫情況,測試出快慢。

備注: 個(gè)人認(rèn)為mongoDB的aggregate $lookup 寫起來太麻煩了。

回答
編輯回答
怣痛
MongoDB has the join-like $lookup aggregation operator in versions >= 3.2. Mongoose has a more powerful alternative called populate(), which lets you reference documents in other collections.

DBRef只能根據(jù)ObjectId,并且有固定的格式要求,所以我傾向于認(rèn)為它是構(gòu)造了查詢,在得到數(shù)據(jù)對象的時(shí)候再根據(jù)引用條件查詢一次得到引用的對象。這樣就造成一個(gè)不可避免的問題,如果一次查詢返回結(jié)果集有10條記錄,那么除了這些記錄外還要進(jìn)行10次額外的查詢來獲取引用它們的對象。性能上面肯定是大打折扣的。

  • $lookup的性能比DBRef好,它只進(jìn)行一次查詢來獲取所有結(jié)果。但是這個(gè)運(yùn)算符目前只能在復(fù)制集中使用,分片集暫不支持。
  • 程序?qū)τ贛ongoDB查詢用了多少時(shí)間,當(dāng)然要從程序端來監(jiān)控。MongoDB端只會(huì)給出查詢用了多少時(shí)間,很多時(shí)候消耗的大頭還可能發(fā)生在網(wǎng)絡(luò)上面。如果對數(shù)據(jù)庫執(zhí)行程序花了多長時(shí)間感興趣,可以參考一下database profiler。但應(yīng)該避免在生產(chǎn)環(huán)境進(jìn)行profiling,因?yàn)樗赡軙?huì)對性能造成比較可觀的影響。

總結(jié)一下,無論是$lookup還是DBRef,都是建議盡量避免的。我在這個(gè)問題里解釋了正確的處理方式及原因,請參考。

2017年9月21日 19:39