mongodb聚合查询优化_Mongodb聚合慢查询优化

本文介绍了如何优化MongoDB的聚合查询,通过分析慢查询、添加复合索引、调整查询语句结构,将原本耗时5秒的查询优化至246毫秒,重点讨论了前置match和合并match的策略,以减少进入管道的数据量,提高查询效率。
摘要由CSDN通过智能技术生成

最近leader让我针对线上一个查询进行优化。举一个相似的例子,以如下的书籍信息文档为例,需要注意的是一本书可能会有多个作者。

业务上的需求是获取指定的50个作者最新出版的的书籍。在优化前,原先的代码逻辑是每次访问数据库获取一个作者参与的图书,按照时间倒序排序,分页取第一条信息。那么完成这个需求需要访问50次mongodb,生产环境这个业务总共耗时5s。leader让我优化到1S内。

这个查询的瓶颈主要是在IO次数上,是否可以访问一次数据库就能得到结果呢。笔者最先想到的是group by操作。以作者id进行group by,但是难点在于每个分组内部都要进行排序,然后取每个分组的第一条数据。Mongodb的分组聚合查询不支持组内排序的操作。

经过思考笔者采用如下的设计,在分组前先对时间进行倒序排序,随后再进行分组,这样获取的每个分组都是按照时间倒序排序的

db.book.aggregate([

{

"$match": {

"authors": {

"$in": ["author1", "author2"]

},

"time": {

"$gte": "20190101",

"$lte": "20191201"

}

}

},

{

"$unwind": "$authors"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值