我们可以在mongodb聚合的match阶段跳过一些文档吗

问题描述 投票:0回答:1

例如,在执行聚合时,最后(上一个)阶段给了我这个文档

{
 _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
.

mongodb mongodb-query aggregation-framework
1个回答
0
投票

您可以将

$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" }
])

注意:建议在组之前使用排序,以便获得一致的“第一个”文档。

蒙戈游乐场

© www.soinside.com 2019 - 2024. All rights reserved.