带有大量文档的 MongoDb 聚合查找?

Posted

技术标签:

【中文标题】带有大量文档的 MongoDb 聚合查找?【英文标题】:MongoDb aggregate lookup with large number of documents? 【发布时间】:2020-10-10 06:12:22 【问题描述】:

我正在使用 MongoDB 并尝试进行聚合查找。 $lookup 的“from”属性中使用的集合中的文档数量为数千。 现在,这会占用所有 CPU 并花费大量时间来响应。

但如果我将文档删除到几百个,它仍然很慢,但比以前快得多。

这是聚合查找的正常行为吗?如果我有大量文档,我是否应该考虑其他事情?

请推荐

【问题讨论】:

只要您有正确的索引,聚合可能需要几毫秒。举例说明您的聚合查询、您的文档并列出您的索引。 谢谢! @Robert Seaman 实际上我正在做的聚合非常简单,但仍然需要几分钟。让我解释一下这个场景。所以有两个集合,一个是User,另一个是Notification。通知有一个字段type。我想获取所有具有特定类型通知的用户。通知集合有数千个文档,我已经索引了 _id 和 type 字段。您认为推荐的方法是什么? 那么,您要汇总 2 个集合?如果您提供文档结构、查询和索引的实际示例会更好。 @RobertSeaman 是的,它涉及两个集合。 Here 是我使用 explain() 得到的。我在 _id 和类型字段上有索引。 【参考方案1】:

也许您应该先找到通知,然后将它们与用户一起加入。 像这样的:

db.getCollection('notifications').aggregate(
    [
        
            $match: 
                type: "type to search"
            
        ,
        
            $lookup: 
                from : 'users',
                localField : 'userId',
                foreignField : '_id',
                as: 'users'
            
        ,
        
            $unwind: "$users"
        ,
        
            $group: 
                _id: "$users"
            
        ,
        
            $replaceRoot:  newRoot: "$_id" 
        
    ] 
)

【讨论】:

以上是关于带有大量文档的 MongoDb 聚合查找?的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB基础教程系列--第七篇 MongoDB 聚合管道

MongoDB聚合操作总结

MongoDB聚合操作总结

04 MongoDB各种查询操作 以及聚合操作总结

MongoDB 查找与使用聚合指定的任何条件匹配的文档

MongoDB