如何比较mongodb数组中的两个对象元素

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 在这里可能会有一些用处,但不确定如何进行下一步。

tur*_*hal 5

总计的():

  • $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
        ]
      }
    }
  }
])
Run Code Online (Sandbox Code Playgroud)

操场


找():

您也可以在find()查询中使用上述匹配阶段表达式条件,而无需任何聚合管道,

操场

最新支持提示:如果您使用的是最新 (4.4) MongoDB 版本,则可以使用$first代替$arrayElemAt,请参阅Playground