【问题标题】:Access same field of every object in array of objects in mongodb aggregation在mongodb聚合中访问对象数组中每个对象的相同字段
【发布时间】:2020-12-26 21:38:34
【问题描述】:

我在 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 个文档,每个文档包含一个银行数组。如上所示,每个银行数组中有 30 个对象。

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

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

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

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

【问题讨论】:

    标签: arrays mongodb aggregation


    【解决方案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"
          }
        }
      }
    ]
    

    【讨论】:

    • 感谢您的回答。实际上展开将不起作用,因为我必须进一步处理每个文档的计数。
    【解决方案2】:

    您可以使用$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

    【讨论】:

    • 感谢您的回答。我得到了所需的结果。
    猜你喜欢
    • 1970-01-01
    • 2021-07-26
    • 2021-04-27
    • 2018-04-20
    • 2021-06-21
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多