使用 MongoDB $arrayToObject 使用自定义键

问题描述 投票:0回答:1

考虑以下聚合管道输出的文档:

{ "_id" : 1, "results" : [
  { "status" : "HOLD", "footage" : 43.01, "pieces" : 1 }, 
  { "status" : "ACCEPTED", "footage" : 80.90, "pieces" : 2 },
  { "status" : "REJECTED", "footage" : 40.00, "pieces" : 1 }
]}

我正在尝试创建自定义键,将状态与素材和片段字段连接起来,从而产生:

{ "_id" : 1, "results" :
  {
    "HOLD_footage": 43.01,
    "HOLD_pieces":1,
    "ACCEPTED_footage": 80.90,
    "ACCEPTED_pieces": 2,
    "REJECTED_footage":40.00,
    "REJECTED_pieces":1
  }
}
mongodb aggregation-framework
1个回答
1
投票

您可以执行以下操作:

  1. 使用
    $map
    使用您想要的键构建 k-v 元组(即 HOLD_footage...)
  2. 使用
    $concatArrays
    对 k-v 元组数组进行分组
  3. 使用
    $objectToArray
    获取您期望的数组形式
db.collection.aggregate([
  {
    "$addFields": {
      "results": {
        "$map": {
          "input": "$results",
          "as": "r",
          "in": [
            {
              k: {
                $concat: [
                  "$$r.status",
                  "_footage"
                ]
              },
              v: "$$r.footage"
            },
            {
              k: {
                $concat: [
                  "$$r.status",
                  "_pieces"
                ]
              },
              v: "$$r.pieces"
            }
          ]
        }
      }
    }
  },
  {
    "$addFields": {
      "results": {
        "$reduce": {
          "input": "$results",
          "initialValue": [],
          "in": {
            "$concatArrays": [
              "$$value",
              "$$this"
            ]
          }
        }
      }
    }
  },
  {
    "$addFields": {
      "results": {
        "$arrayToObject": "$results"
      }
    }
  }
])

Mongo 游乐场

© www.soinside.com 2019 - 2024. All rights reserved.