MongoDb Aggregation - 将值设置为键,将相应的数组值设置为值

Sha*_*332 4 mongodb aggregation-framework

在mongodb中,我在运行聚合后有一个以下形状的get对象.

 {
      "_id": 1,
      "specificationList": {
        "key": "Memory & Storage Features",
        "values": [
          {
            "key": "Internal Storage",
            "value": [
              "32 KB"
            ]
          },
          {
            "key": "RAM",
            "value": [
              "32 MB"
            ]
          },
          {
            "key": "Expandable Storage",
            "value": [
              "8 GB"
            ]
          },
          {
            "key": "Supported Memory Card Type",
            "value": [
              "MicroSD"
            ]
          }
        ]
      }
    }
Run Code Online (Sandbox Code Playgroud)

从上面的文档中,我怎样才能在下一个聚合管道中获得下面形状的对象.我需要达到以下形状,以使代码更清洁.我正在使用聚合来达到上面的形状(所以想要附加另一个管道),并且知道在下面的形状得到什么聚合管道会很好

{
 "specList” : {
    “Internal Storage”: “32 KB”,
   “RAM”:”32 MB”,
   “Expandable Storage”:”8 GB”,
    “Supported Memory Card Type”:”MicroSD”
   }
}
Run Code Online (Sandbox Code Playgroud)

chr*_*dam 8

不知道完整的管道,你可以用$arrayToObject它转换一个数组运算符成一个单一的文件,但该阵列必须包含两个字段,kvk字段包含字段名和v字段包含字段的值.在上面的聚合文档中,您需要将values数组映射到上面的格式,$arrayToObject然后操作符可以愉快地转换.

考虑添加一个$project管道步骤,该步骤使用$map运算符更改数组结构,然后将转换结果应用于所需对象.

以下说明了这一点:

db.collection.aggregate([
    { ... }, // <-- previous pipeline
    {
        "$project": {
            "specList": {
                "$arrayToObject": {
                    "$map": {
                        "input": "$specificationList.values",
                        "as": "el",
                        "in": {
                            "k": "$$el.key",
                            "v": { "$arrayElemAt": ["$$el.value", 0] }
                        }
                    }
                }
            }
        }
    }
])
Run Code Online (Sandbox Code Playgroud)