例如,在执行聚合时,最后(上一个)阶段给了我这个文档
{
_id : ObjectId('662a416201ca2363543b6644'),
name : 'location-1',
startsFrom : 2,
endsOn : 5,
}
{
_id : ObjectId('662a416201ca2363543b6644'),
name : 'location-1',
startsFrom : 1,
endsOn : 3,
}
{
_id : ObjectId('662a416201ca2363543b6644'),
name : 'location-1',
startsFrom : 2,
endsOn : 4,
}
下一阶段是
$match
{
$match{
"startsFrom" : { $lte : 2},
"endsOn" : { $gte : 2},
}
}
与第一个文档进行比较后,匹配阶段的结果为 true 。因此,我想跳过与完成匹配阶段并获得结果
$match
的文档相同 _id
的所有其他文档的 true
阶段。
如果这是不可能的,是否有任何其他替代解决方案可以在不改变先前聚合阶段的情况下降低计算功耗
注意: 在上一个
_id
阶段之后具有相同 $unwind
的文档可能是
超过 100 万,对于多个 _ids
.
您可以将
$group
与 $first
累加器一起使用:
db.collection.aggregate([
// start: example "previous stages"
{ $unwind: "$docs" },
{ $replaceWith: "$docs" },
// end: example "previous stages"
{
$match: {
"startsFrom": { $lte: 2 },
"endsOn": { $gte: 2 }
}
},
// put a sort here
{
$group: {
_id: "$_id",
first_doc: { $first: "$$ROOT" }
}
},
{ $replaceWith: "$first_doc" }
])
注意:建议在组之前使用排序,以便获得一致的“第一个”文档。