如何在猫鼬中查询多个集合

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列表需要很长时间。

以上是关于如何在猫鼬中查询多个集合的主要内容,如果未能解决你的问题,请参考以下文章

在猫鼬中,如何根据相关集合中的值查找记录?

如何使用嵌入模式的express在猫鼬中传递多个复杂查询以将其呈现为我的ejs文件

如何使用各种参数在猫鼬中进行搜索查询?

如何在猫鼬中使用聚合

如何在猫鼬中执行“每个”查询

关于如何在猫鼬中编写评论模式的任何想法?