2016-12-04 27 views
1

我有兩個模式「用戶」和「書籍」。如何在貓鼬中查詢多個集合

用戶:_id,isActive類型:布爾

書籍:用戶ID REF用戶,名字

我要查詢的書籍,用戶的isActive是真實的。

我有一種方法是首先查詢具有isActive = true的用戶並返回userid列表,然後使用userid列表中的userid查詢Books。

任何人都可以有其他更好的方法來查詢這種情況嗎?謝謝。

回答

0

這取決於您的收藏的問題和尺寸!當您的活動用戶有限時,您的方法很好。但是,如果您的圖書收藏量很小時,您的活動用戶數量很多,那麼我會建議加載這些圖書,然後檢查每個用戶是否處於活動狀態!

另外,如果你有很多活躍的用戶和很多書,那麼在Book中存儲用戶的活動狀態並不是一個壞主意。

+0

這太糟糕了,如果有大量的用戶,並且需要很長時間才能獲得用戶名單。 –

0

版本3.2介紹$lookup,其工作原理類似於左外連接aggregation管道。

User.aggregate([ 
    { 
     $match: {isActive: true} 
    }, 
    { 
     $lookup: //left outer join 
     { 
      from: "books", 
      localField: "_id", 
      foreignField: "userid", 
      as: "books" 
     } 
    }, 
    { 
     $unwind: "$books" // convert each element of "books" array into its own document 
    }, 
    { 
     $replaceRoot: { newRoot: "$books" } // remove "books" key. Bring its content out in the root 
    } 

]).exec(function(err, books) { 
    // books with users isActive true 
}) 

需要注意的是,我們用User聚集,因爲我們想查詢isActive: true,但是在聚合管道處理的文件後,我們在最後得到books