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

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

想問的三個問題

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

備注: 個人認(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ù)對象的時候再根據(jù)引用條件查詢一次得到引用的對象。這樣就造成一個不可避免的問題,如果一次查詢返回結(jié)果集有10條記錄,那么除了這些記錄外還要進(jìn)行10次額外的查詢來獲取引用它們的對象。性能上面肯定是大打折扣的。

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

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

2017年9月21日 19:39