首页 > 解决方案 > MongoDB Atlas 扫描对象/以固定大小的聚合结果返回

问题描述

我在执行的聚合查询中收到“扫描的对象/返回的已超过 1000”的警报。

首先,目标是聚合 7 天,每天都有一个唯一userId值计数。因此,在这种情况下,聚合的结果将是 7 个文档,其中每个文档 id 是相关日期,其中的一个字段表示这一天有count多少个唯一值。userId

例如,我执行以下聚合:

[
  { $match: { timestamp: { $gte: {"$date": 1613001600000} } }},
  {
    $bucket: {
      boundaries: [
        {
          "$date": 1613001600000
        },
        {
          "$date": 1613088000000
        },
        {
          "$date": 1613174400000
        },
        {
          "$date": 1613260800000
        },
        {
          "$date": 1613347200000
        },
        {
          "$date": 1613433600000
        },
        {
          "$date": 1613520000000
        },
        {
          "$date": 1613606400000
        }
      ],
      groupBy: "$timestamp",
      output: { users: { $addToSet: "$userId" } }
    }
  },
  {
    $project: {
      count: { $size: "$users" },
    }
  }
]

这个explain()聚合是:

"queryPlanner": {
  "plannerVersion": 1,
  "namespace": "3fa85f64-5717-4562-b3fc-2c963f66afa6.device_events",
  "indexFilterSet": false,
  "parsedQuery": {
    "timestamp": {
      "$gte": ISODate("2021-02-11T00:00:00Z")
    }
  },
  "queryHash": "3F0BEC12",
  "planCacheKey": "3F0BEC12",
  "winningPlan": {
    "stage": "COLLSCAN",
    "filter": {
      "timestamp": {
        "$gte": ISODate("2021-02-11T00:00:00Z")
      }
    },
    "direction": "forward"
  },
  "rejectedPlans": []
},
"executionStats": {
  "executionSuccess": true,
  "nReturned": 376966,
  "executionTimeMillis": 381,
  "totalKeysExamined": 0,
  "totalDocsExamined": 441545,
  "executionStages": {
    "stage": "COLLSCAN",
    "filter": {
      "timestamp": {
        "$gte": ISODate("2021-02-11T00:00:00Z")
      }
    },
    "nReturned": 376966,
    "executionTimeMillisEstimate": 0,
    "works": 441547,
    "advanced": 376966,
    "needTime": 64580,
    "needYield": 0,
    "saveState": 3478,
    "restoreState": 3478,
    "isEOF": 1,
    "direction": "forward",
    "docsExamined": 441545
  }
}

不知何故,对于完全相同的聚合,explain()显示的值与探查器输出不同。nReturned探查器输出显示nReturned为 7,这是预期的。

因此,在我看来,我将始终收到此警报,因为 7 天内的文档数为X > 1007,并且返回的文档数将始终为 7。

我错过了什么吗?这是获得我需要的结果的糟糕解决方案吗?

提前致谢!:)

标签: mongodbmongodb-atlas

解决方案


推荐阅读