Mongodb聚合管道优化-$ match的2个阶段

时间:2019-06-10 15:00:28

标签: mongodb aggregation-framework query-optimization

我最近正在研究聚合管道的性能优化。在确定要编制索引时遇到了这个问题。我为{'receiverId': 1,'type': 1 }设置了复合索引。 我原来的管道看起来像这样。我在考虑是否为isRead编制索引 也有必要。我之所以没有创建三字段复合索引的原因是,其他查询仅使用recieverIdtype

notifications.aggregate([{
        $match: {
            'recieverId': ObjectId(xxx),
            'type': xxx,
            'isRead': false
        }
    },
    {
     ...
    },
], (err, result) => {
    return res.status(200).json(result);
});

因此,我在下面更改为此。想知道这样的管道在过滤recieverIdtype之后是否可以节省一些计算成本。 isRead,第二$match会从第一个$match的结果中过滤吗?

notifications.aggregate([{
        $match: {
            'recieverId': ObjectId(xxx),
            'type': xxx,
        }
    },
    {
        $match: {
            'isRead': false
        }
    },
    {
     ...
    },
], (err, result) => {
    return res.status(200).json(result);
});

1 个答案:

答案 0 :(得分:1)

实际上无关紧要,因为mongo将优化此管道。

从文档中

  

当一个$ match紧接着另一个$ match时,这两个阶段可以合并为一个$ match。

了解有关它以及其他管道优化的信息,mongo会here