聚合中的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。数据库中的文档的主要内容,如果未能解决你的问题,请参考以下文章