首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB:使用$or聚合优化的$match

MongoDB:使用$or聚合优化的$match
EN

Stack Overflow用户
提问于 2020-03-28 21:29:18
回答 1查看 61关注 0票数 0

我遇到了一个如何优化这个$match的问题。目前我有以下代码

代码语言:javascript
复制
{ $match: {
            $or: [
                { 'card': { $eq: 'card1'},
                 $and: [
                         { 'createdAt': { $gte: three_months }},
                         { 'createdAt': { $lte: createdAt }}
                        ]
                },
                { 'client': { $eq: 'client1'},
                 $and: [
                         { 'client': { $ne: null }},
                         { 'createdAt': { $gte: three_months }},
                         { 'createdAt': { $lte: createdAt }}
                        ]
                },
            { 'destination_card': { $eq: 'destination_card1'},
                 $and: [
                         { 'createdAt': { $gte: three_months }},
                         { 'createdAt': { $lte: createdAt }}
                        ]
                },

            ]
           }
{ $limit: 300},
{ $sort: { createdAt: -1 } },

但有时计算是错误的,或者它执行的时间太长。请你给出一些如何优化它的想法?首先要感谢大家!

EN

回答 1

Stack Overflow用户

发布于 2020-03-29 08:51:24

如果您使用的是较新版本的MongoDB (我认为是3.6+),查询规划器可以使用多个索引来处理$or。每个分支在createdAt上使用相同的标准,因此您可以将它们收集在一起,只列出一次,例如:

代码语言:javascript
复制
{$match: {
     {'createdAt':{$gte: three_months, $lte: createdAt}},
     {$or:[
        {'card': 'card1'},
        {'client': 'client1'},
        {'destination_card': 'destination_card1
     ]}
}}

如果创建3个索引,每个索引都有一个精确匹配的字段和createdAt,就像{card:1, createdAt:1}一样,它将改进选择并减少检查的文档数量,这可能有助于提高执行时间。

请注意,使用$or通常会阻止查询执行器使用索引执行排序,每次运行此查询时都需要在内存中进行排序,这会增加执行此查询所需的内存,这可能会在服务器繁忙时减慢执行速度。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60901773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档