我最近正在研究聚合管道的性能优化。在确定要编制索引时遇到了这个问题。我为{'receiverId': 1,'type': 1 }
设置了复合索引。
我原来的管道看起来像这样。我在考虑是否为isRead
编制索引
也有必要。我之所以没有创建三字段复合索引的原因是,其他查询仅使用recieverId
和type
。
notifications.aggregate([{
$match: {
'recieverId': ObjectId(xxx),
'type': xxx,
'isRead': false
}
},
{
...
},
], (err, result) => {
return res.status(200).json(result);
});
因此,我在下面更改为此。想知道这样的管道在过滤recieverId
和type
之后是否可以节省一些计算成本。 isRead
,第二$match
会从第一个$match
的结果中过滤吗?
notifications.aggregate([{
$match: {
'recieverId': ObjectId(xxx),
'type': xxx,
}
},
{
$match: {
'isRead': false
}
},
{
...
},
], (err, result) => {
return res.status(200).json(result);
});
答案 0 :(得分:1)
实际上无关紧要,因为mongo将优化此管道。
从文档中
当一个$ match紧接着另一个$ match时,这两个阶段可以合并为一个$ match。
了解有关它以及其他管道优化的信息,mongo会here。