首页 > 解决方案 > 检查提供的数据数组中的每个元素至少存在一行

问题描述

这与我之前的问题有关mongo count rows from a array of provided data ...我的真实集合很大,查询并通过分组获得该计数需要将近 4 分钟,我真的需要检查是否有是否是每个 subLevel.id 的文档。不知道它是否会更快......想,但我想尝试,但我找不到这样做的方法......

它应该如何工作是从 in 子句中获取第一个值并搜索直到找到匹配的文档,如果找到或到达集合的末尾则跳转到下一个。如果可能的话,再来一次。

谢谢。

标签: mongodb

解决方案


我怀疑聚合速度很慢,因为它花费大量时间从磁盘读取文档,并通过管道移动这些文档。

如果查询可以通过对索引的连续范围的单次扫描来服务,MongoDB 可以使用优化的 COUNT_SCAN 阶段来计算文档。

您提到的问题的查询是

db.collection.aggregate([
  {
    "$match": { "subLevel.id": { "$in": [ 1, 2 ] } }
  },
  {
    "$group": { "_id": "$subLevel.id", "count": { "$sum": 1 } }
  }
])

要使用优化,集合需要有一个索引{"subLevel.id":1},并且您需要分别提交每个 id。在 mongo shell 中,这可能看起来像:

[1, 2].map(v => {
   return {
           value:v, 
           count: db.collection.countDocuments({"subLevel.id":v})
          }
})

虽然这需要针对每个 id 对数据库进行单独的查询,但无需加载单个文档即可处理查询的性能优势应该会显着减少整体运行时间。


推荐阅读