如何比较mongodb数组中的两个对象元素
{
"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”声明变量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
]
}
}
}
])
操场
找():
您也可以在find()查询中使用上述匹配阶段表达式条件,而无需任何聚合管道,
操场
最新支持提示:如果您使用的是最新 (4.4) MongoDB 版本,则可以使用
$first代替$arrayElemAt,请参阅Playground