访问 mongodb 聚合中对象数组中每个对象的相同字段

Access same field of every object in array of objects in mongodb aggregation

我在 mongodb 中收集了以下文档:

banks:[{name:"ABC", amt:0},{name:"PQR", amt:-1},{name"XYZ", amt:3400}]

banks:[{name:"ABC", amt:-2},{name:"PQR", amt:2344},{name"XYZ", amt:7600}]

这样说我有 10 个文档,每个文档包含一个 banks 数组。如上所示,每个 banks 数组中有 30 个对象。

我正在尝试在 mongodb 中编写聚合查询以获取“amt”小于等于零且大于零但到目前为止无法获取的对象的计数。请帮忙。提前致谢!

上述示例文档的输出应该是

{"greaterThanZero": 1, "lessThanEqualToZero": 2 }

{"greaterThanZero": 2, "lessThanEqualToZero": 1 }

首先你必须用 $unwind

分隔你的文档

然后用 $project$cond 告诉每个文档是 greaterThanZero 还是 lessThanEqualToZero

最后你用 $group

总结了 greaterThanZerolessThanEqualToZero

您可以在这里进行测试:Mongo Playground

[
  {
    "$unwind": "$banks"
  },
  {
    "$project": {
      "greaterThanZero": {
        "$cond": [
          {
            "$gt": [
              "$banks.amt",
              0
            ]
          },
          1,
          0
        ]
      },
      "lessThanEqualToZero": {
        "$cond": [
          {
            "$lte": [
              "$banks.amt",
              0
            ]
          },
          1,
          0
        ]
      }
    }
  },
  {
    "$group": {
      "_id": "$_id",
      "greaterThanZero": {
        "$sum": "$greaterThanZero"
      },
      "lessThanEqualToZero": {
        "$sum": "$lessThanEqualToZero"
      }
    }
  }
]

你可以用 $reduce,

  • 它使用 $cond 检查条件,如果匹配则将值加一,
db.collection.aggregate([
  {
    $project: {
      lessThanEqualToZero: {
        $reduce: {
          input: "$banks",
          initialValue: 0,
          in: {
            $cond: [
              { $lte: ["$$this.amt", 0] },
              { $add: ["$$value", 1] },
              "$$value"
            ]
          }
        }
      },
      greaterThanZero: {
        $reduce: {
          input: "$banks",
          initialValue: 0,
          in: {
            $cond: [
              { $gt: ["$$this.amt", 0] },
              { $add: ["$$value", 1] },
              "$$value"
            ]
          }
        }
      }
    }
  }
])

Playground