mongodb - 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。
我错过了什么吗?这是获得我需要的结果的糟糕解决方案吗?
提前致谢!:)
解决方案
推荐阅读
- python - 计算 Pandas 系列中的值组
- python - 防止 Django 的 JsonResponse 序列化我的字符串
- laravel - 如何在 Laravel Homestead 中启用 php-Mcrypt 扩展
- python - 如何在文件名中插入零以使它们的长度相同
- java - 使用JpaPagingItemReader时spring批处理如何在内部初始化状态?
- scala - 从案例类集合创建 Flink DataStream 时“未找到隐含”
- python - 爬虫脚本运行没有错误,但没有我预期的输出 excel
- server - 如何配置 sendmail 以将电子邮件从邮件服务器转发到邮件服务器
- c# - Owin WebApp Dispose 不释放 URL 注册
- python - python numpy.fft.rfft:为什么在包含或不包含 NFFT 时,输出有很大不同