我有兩個模式「用戶」和「書籍」。如何在貓鼬中查詢多個集合
用戶:_id,isActive類型:布爾
書籍:用戶ID REF用戶,名字
我要查詢的書籍,用戶的isActive是真實的。
我有一種方法是首先查詢具有isActive = true的用戶並返回userid列表,然後使用userid列表中的userid查詢Books。
任何人都可以有其他更好的方法來查詢這種情況嗎?謝謝。
我有兩個模式「用戶」和「書籍」。如何在貓鼬中查詢多個集合
用戶:_id,isActive類型:布爾
書籍:用戶ID REF用戶,名字
我要查詢的書籍,用戶的isActive是真實的。
我有一種方法是首先查詢具有isActive = true的用戶並返回userid列表,然後使用userid列表中的userid查詢Books。
任何人都可以有其他更好的方法來查詢這種情況嗎?謝謝。
這取決於您的收藏的問題和尺寸!當您的活動用戶有限時,您的方法很好。但是,如果您的圖書收藏量很小時,您的活動用戶數量很多,那麼我會建議加載這些圖書,然後檢查每個用戶是否處於活動狀態!
另外,如果你有很多活躍的用戶和很多書,那麼在Book中存儲用戶的活動狀態並不是一個壞主意。
版本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
。
這太糟糕了,如果有大量的用戶,並且需要很長時間才能獲得用戶名單。 –