如何在猫鼬中查询多个集合
Posted
技术标签:
【中文标题】如何在猫鼬中查询多个集合【英文标题】:How to query multiple collections in mongoose 【发布时间】:2017-04-18 18:02:45 【问题描述】:我有两个架构“用户”和“书籍”。
用户:_id,isActive 类型:布尔
书籍:userid ref 用户、姓名
我要查询用户的isActive为真的Books。
我有一种方法是首先使用 isActive=true 查询用户并返回用户 ID 列表,然后在用户 ID 列表中使用用户 ID 查询图书。
谁能有其他更好的方法来查询这种情况?谢谢。
【问题讨论】:
【参考方案1】: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
。
【讨论】:
【参考方案2】:这取决于您收藏的问题和大小!当您的活跃用户有限时,您的方法很好。但是,如果您有很多活跃用户,而您的图书收藏量很小,那么我建议您加载图书,然后检查每个用户是否处于活跃状态!
此外,如果您有大量活跃用户和大量书籍,那么将用户的活跃状态存储在 Book 中也不是一个坏主意。
【讨论】:
那太糟糕了,如果有大用户,那么获取用户ID列表需要很长时间。以上是关于如何在猫鼬中查询多个集合的主要内容,如果未能解决你的问题,请参考以下文章