聚合中的mongodb $count 太慢,超过1mill。数据库中的文档

Posted

技术标签:

【中文标题】聚合中的mongodb $count 太慢,超过1mill。数据库中的文档【英文标题】:Mongodb $count in aggregation is too slow, working with more than 1mill. docs in db 【发布时间】:2019-08-05 09:23:10 【问题描述】:

我正在尝试过滤嵌入文档的数组并获取所有文档中的计数总和。

数据库中的数据结构。


     name: String,
     transactions: [
      type: String,
      isValid: String
     ]

我还对 type & isValid 字段使用多个 indexex。

这是我的聚合。

 await Collection.aggregate([
   '$unwind': '$transactions' ,
   '$replaceRoot':  newRoot: '$transactions'  ,
   '$match':  '$and': [  type:  '$eq': 'Anything'  ,
   '$or': [  isValid:  '$eq': true  ,  isValid:  '$eq': null   ]  ]  ,
   '$count': "count"] 

延迟约为 15 秒。

 await Collection.aggregate([
   '$count': "count"]

在聚合延迟中仅使用 $count 是相同的 ~15 秒。无法弄清楚它是如何工作的。

集合文档。计数超过 1mill。并获得嵌入式阵列的计数总和大约需要 15 秒。 任何人都可以建议如何优化查询?

【问题讨论】:

请发布您收藏的示例文档 【参考方案1】:

尝试实现这个:

 await Collection.aggregate([
  $group:_id:null,count:$sum:$size:
                                
                                    $filter: 
                                        input: "$transactions", as: "item",
                                        cond:
                                            $and: [
                                                $eq: ["$$item.type", "Anything"],
             '$or': [  "$eq":["$$item.isValid",true], "$eq":["$$item.isValid",null]] 
                                            ]
                                    
                                ])

【讨论】:

我有一个错误。带有此消息:“$size 的参数必须是一个数组,但类型为:null” 对于 $size 需要一个数组来运行,您可以在 $size 中添加 cond $cond:if:$lte:["$transactions",null],then:[], else:$size: $filter: input: "$transactions", as: "item", cond: $and: [ $eq: ["$$item.type", "Anything"], '$or': [ "$eq":["$$item.isValid",true], "$eq":["$$item.isValid",null]] ]

以上是关于聚合中的mongodb $count 太慢,超过1mill。数据库中的文档的主要内容,如果未能解决你的问题,请参考以下文章

mongodb3 之单一用途聚合

避免 MongoDB 聚合中的空花括号

MongoDB(课时26 聚合(取的集合个数))

Mongodb07 - 聚合

mongodb Aggregation聚合操作之$facet

mongodb Aggregation聚合操作之$sort