可以使用 $addFields 和 $group 命令来代替 facet。如下所示,使用 $addFields 将需要聚合的字段提前计算出来,然后使用 $group 进行分组聚合。
db.collection.aggregate([
{
$search: {
index: 'index_name',
search: { query: 'search_term' }
}
},
{
$addFields: {
'year_month_day': { $dateToString: { format: '%Y-%m-%d', date: '$date_field' } },
...
}
},
{
$group: {
_id: '$year_month_day',
'count1': { $sum: '$count1' },
'count2': { $sum: '$count2' },
...
}
}
]);
此方法可以替代 Atlas Search 中的 facet,因为可以在使用 $search 命令之后根据字段进行聚合,避免了使用 facet 时的性能问题。