作者:mobiledu2502857983 | 来源:互联网 | 2023-09-14 10:57
{
"customerSchemes": [
{
"name": "A",
"startDate": some date in valid date format
},
{
"name": "B",
"startDate": some date in valid date format.
}
]
}
我试图找出方案 A 在方案 B 之前开始的所有文档。请注意,方案数组不是按 startDate 的升序排列的。与计划 A 相比,计划 B 可以有一个更早的日期。我相信 unwind operator 在这里可能会有一些用处,但不确定如何进行下一步。
回答
总计的():
$filter
以过滤name: "A"
从customerSchemes
$arrayElemAt
从上述步骤的过滤结果中获取第一个元素
- 与上述相同的步骤
name: "B"
$let
为“A”a
和“B”声明变量b
in
如果a
'sstartDate
大于b
's则从上面的变量检查条件startDate
然后返回 true 否则返回 false
$expr
表达式匹配$eq
以匹配上述过程,如果为真则返回文档
db.collection.aggregate([
{
$match: {
$expr: {
$eq: [
{
$let: {
vars: {
a: {
$arrayElemAt: [
{
$filter: {
input: "$customerSchemes",
cond: { $eq: ["$$this.name", "A"] }
}
},
0
]
},
b: {
$arrayElemAt: [
{
$filter: {
input: "$customerSchemes",
cond: { $eq: ["$$this.name", "B" ] }
}
},
0
]
}
},
in: { $gt: ["$$a.startDate", "$$b.startDate"] }
}
},
true
]
}
}
}
])
操场
找():
您也可以在find()
查询中使用上述匹配阶段表达式条件,而无需任何聚合管道,
操场
最新支持提示:如果您使用的是最新 (4.4) MongoDB 版本,则可以使用$first
代替$arrayElemAt
,请参阅Playground