匹配某些条件前后的元素

Match elements before and after some criteria

假设我有一个有序(通过$sort聚合管道阶段)文档列表:

    { x: 0 }
    { x: 1 }
    { x: 3 }
    { x: 4 }
    { x: 5 }
    { x: 6 }

现在我可以 select 使用聚合管道阶段 x >= 3 的所有文档:

    { $match: { x: { $gte: 3 } } }

但是是否也可以匹配 x >= 3 单个 查询中第一个匹配元素之前的第一个元素的所有文档?

预期结果是:

    { x: 1 }
    { x: 3 }
    { x: 4 }
    { x: 5 }
    { x: 6 }

(我需要这个来实现中继兼容分页)

您可以使用$facet分成2个流水线进行处理。然后使用 $setUnion 重新组合结果。

db.collection.aggregate([
  {
    "$facet": {
      "smaller": [
        {
          "$match": {
            x: {
              $lt: 3
            }
          }
        },
        {
          $sort: {
            x: -1
          }
        },
        {
          "$limit": 1
        }
      ],
      "larger": [
        {
          "$match": {
            x: {
              $gte: 3
            }
          }
        }
      ]
    }
  },
  // cosmetics to revert back to original form
  {
    "$project": {
      final: {
        "$setUnion": [
          "$smaller",
          "$larger"
        ]
      }
    }
  },
  {
    "$unwind": "$final"
  },
  {
    "$replaceRoot": {
      "newRoot": "$final"
    }
  }
])

这里是Mongo playground供大家参考。