首页 > 解决方案 > Mongodb 聚合:$reduce 未按预期工作

问题描述

我有一个$reduce没有按预期工作的 mongodb 聚合管道。就是我想要达到的目标。

基本上我试图获取给定属性中具有最高值的对象。在某些对象$reduce中返回错误的对象,在其他对象中返回null,这意味着没有对象满足条件。

我的代码有小组阶段和其他阶段,它们产生阶段中使用的变量$reduce。聚合管道中是否有任何已知的可能影响该阶段的先前阶段$reduce

标签: arraysmongodbmongodb-queryaggregation-frameworkreduce

解决方案


  • $maxkey从字段数组中获取最大值a,这将-15根据您的文档返回
  • $filter获取等于-15值的对象
  • $first从返回的结果中获取第一个对象$filter
db.collection.aggregate([
  {
    $addFields: {
      winner: {
        $first: {
          $filter: {
            input: "$key",
            cond: { $eq: ["$$this.a", { $max: "$key.a" }] }
          }
        }
      }
    }
  }
])

操场


使用运算符的第二个选项$reduce

  • 在reduce中设置初始字段,字段数组中的maxValue最大值keya
  • 检查条件是否maxValuea值匹配然后返回最大对象
db.collection.aggregate([
  {
    $addFields: {
      winner: {
        $reduce: {
          input: "$key",
          initialValue: { maxValue: { $max: "$key.a" } },
          in: {
            $cond: [
              { $eq: ["$$this.a", "$$value.maxValue"] },
              "$$this",
              "$$value"
            ]
          }
        }
      }
    }
  }
])

操场


推荐阅读