【发布时间】:2020-01-16 22:35:14
【问题描述】:
在 MongoDB 中,我有一个包含带有时间戳的文档的集合。我还对某些文档(按两个字段过滤)进行了汇总(按用户和月份分组)。该视图定义了一个复合索引:它由userId 和一个monthOfYear(带有月份的字符串YYYY-MM)组成。该视图还仅定义了两个字段:两者都是原始集合中某些字段的总和。
接下来我尝试在视图上运行查询,如果我尝试获取特定 userId 的视图的最后 13 个条目。
即使没有写入数据库(原始集合中的 50k 个文档需要 300 毫秒),这个查询的运行似乎也很慢。
我不明白应该创建什么样的索引来支持我的查询。如何优化它?
这是视图定义:
{
"name": "my_view",
"type": "view",
"options": {
"viewOn": "my_collection",
"pipeline": [
{
"$match": {
"a": "val1",
"b": "val2"
}
},
{
"$group": {
"_id": {
"userId": "$userId",
"monthOfYear": {
"$dateToString": {
"format": "%Y-%m",
"date": "$timestamp"
}
}
},
"total": {
"$sum": "$val3"
},
"count": {
"$sum": 1
}
}
},
{
"$sort": {
"_id.monthOfYear": -1
}
}
]
},
"info": {
"readOnly": true
}
}
还有查询:
{
"find": "my_view",
"filter": {
"_id.userId": "000000000aaaa",
"_id.monthOfYear":
{
"$gte":
"2019-01"
}
},
"lsid": {
"id": UUID("aaa-bbb")
},
"$db":
"my-db"
}
谢谢!
【问题讨论】:
标签: mongodb database-design query-optimization