首页 > 解决方案 > 如何将数组文档值收集到 MongoDB 中的父文档中

问题描述

如何执行与LATERAL VIEW EXPLODE类似的聚合,然后在 spark 中选择所需的列,但使用 mongodb?

例如转换类似于以下内容的文档:

{
    name: "john",
    surname: "doe",
    arr: [
        {
            itemName: "address",
            itemVal: "2333. Street"
        },{
            itemName: "phone",
            itemVal: "43098685446"
        }
    ]
}

成平面文件:

{
    name: "john",
    surname: "doe",
    address: "2333. Street",
    phone: "43098685446"
}

标签: mongodb

解决方案


试试这个:

MongoDB >= v4.2

db.collection.aggregate([
  {
    $replaceWith: {
      $mergeObjects: [
        "$$ROOT",
        {
          $arrayToObject: {
            $map: {
              input: "$arr",
              in: {
                k: "$$this.itemName",
                v: "$$this.itemVal"
              }
            }
          }
        }
      ]
    }
  },
  {
    $unset: [
      "_id",
      "arr"
    ]
  }
])

Mongo游乐场

MongoDB >= v3.6

db.collection.aggregate([
  {
    $replaceRoot: {
      newRoot: {
        $mergeObjects: [
          "$$ROOT",
          {
            $arrayToObject: {
              $map: {
                input: "$arr",
                in: {
                  k: "$$this.itemName",
                  v: "$$this.itemVal"
                }
              }
            }
          }
        ]
      }
    }
  },
  {
    $project: {
      _id: 0,
      arr: 0
    }
  }
])

Mongo游乐场

MongoDB >= v3.4.4

db.collection.aggregate([
  {
    $replaceWith: {
      $arrayToObject: {
        $concatArrays: [
          {
            $objectToArray: "$$ROOT"
          },
          {
            $map: {
              input: "$arr",
              in: {
                k: "$$this.itemName",
                v: "$$this.itemVal"
              }
            }
          }
        ]
      }
    }
  },
  {
    $project: {
      _id: 0,
      arr: 0
    }
  }
])

Mongo游乐场


推荐阅读