如何在MongoDB中使用计算字段优化视图上的查询?



在MongoDB中,我有一个集合,用于保存带有时间戳的文档。我还对一些文档(按两个字段过滤(进行了汇总(按用户和月份分组(的看法。该视图定义了一个复合索引:它由userIdmonthOfYear(带有月份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通过在读取操作期间按需执行聚合来计算视图内容。MongoDB对视图执行读取操作,作为底层聚合管道的一部分。 https://docs.mongodb.com/manual/core/views/

所以对my_view执行查询,MongoDB fist 对my_collection执行聚合,然后对返回的结果执行查询。

尝试为my_collection创建复合索引({a:1, b:1}),以查看性能是否提高,但$group查询会降低。

其他解决方案是按需实例化视图。执行聚合并使用$out或$merge运算符在collection中存储聚合数据(假设my_collection2(。现在,您为my_collection2创建索引,您的查询将急剧增加。

注意:每次更新my_collection时,都需要更新my_collection2数据。

最新更新