Jav*_*per 5 mongodb aggregation-framework
{
"customerSchemes": [
{
"name": "A",
"startDate": some date in valid date format
},
{
"name": "B",
"startDate": some date in valid date format.
}
]
}
Run Code Online (Sandbox Code Playgroud)
我试图找出方案 A 在方案 B 之前开始的所有文档。请注意,方案数组不是按 startDate 的升序排列的。与计划 A 相比,计划 B 可以有一个更早的日期。我相信 unwind operator 在这里可能会有一些用处,但不确定如何进行下一步。
$filter以过滤name: "A"从customerSchemes$arrayElemAt 从上述步骤的过滤结果中获取第一个元素name: "B"$let为“A”a和“B”声明变量bin如果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
]
}
}
}
])
Run Code Online (Sandbox Code Playgroud)
您也可以在find()查询中使用上述匹配阶段表达式条件,而无需任何聚合管道,
最新支持提示:如果您使用的是最新 (4.4) MongoDB 版本,则可以使用
$first代替$arrayElemAt,请参阅Playground
| 归档时间: |
|
| 查看次数: |
184 次 |
| 最近记录: |