匹配某些条件前后的元素
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供大家参考。
假设我有一个有序(通过$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供大家参考。