mongodb聚合管道-将数组条目转换为子文档

时间:2020-02-05 17:34:08

标签: mongodb

我正在研究mongodb聚合管道。我目前有以下文件:

{
  "data": [
    { "type": "abc", "price": 25000, "inventory": 15 },
    { "type": "def", "price": 8000, "inventory": 150 }
  ]
}

我想上交它:

{
    "abc": { "price": 25000, "inventory": 15 },
    "def": { "price": 8000, "inventory": 150 }
}

我可以在一个$project阶段中逐个字段地执行此操作,但是显然,我的实际示例比该简单示例具有更多的字段...而且我也不确定哪个值可以输入类型。 / p>

2 个答案:

答案 0 :(得分:2)

由于data是一个数组,因此可以使用类似于以下内容的聚合管道:

  • $ unwind将其拆分为单独的文档,每个文档包含一个项目
  • $ project将其从{type:x, price:y, inventory:z}更改为[x,[{price:y, inventory:z}]]
  • $ group将项目收集回单个数组
  • $ arrayToObject将数组数组转换为[{x:{price:y,inventory:z}},...]

如果您需要更多详细信息,可以在有更多时间的情况下查看有关处理样品的信息。

答案 1 :(得分:1)

感谢 @Joe ,我设法创建了一个解决方案:

db.collection.aggregate([
  {
    $unwind: "$data"
  },
  {
    $project: {
      data: [
        "$data.type",
        {
          price: "$data.price",
          inventory: "$data.inventory"
        }
      ],          
    }
  },
  {
    $group: {
      _id: "$_id",
      doc: {
        $push: "$$ROOT"
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: {
        $arrayToObject: "$doc.data"
      }
    }
  }
])

结果:

[
  {
    "abc": {
      "inventory": 15,
      "price": 25000
    },
    "def": {
      "inventory": 150,
      "price": 8000
    }
  }
]

蒙哥Playground