MongoDB聚合:将数组聚合到键对象中

时间:2018-08-23 17:23:47

标签: mongodb aggregation-framework

我想使用聚合功能将文档数组展平为键对象。这是我的文档的示例:

gitattributes

预期结果:

filter

我看过不同的运算符,例如[ { "_id": 1, "texts": [ { "language": "english", "text": "hello" }, { "language": "german", "text": "hallo" }, { "language": "french", "text": "bonjour" } ] }, … ] ,但这似乎是在将数组转换为数组时出现的。我可能需要等价于[ { "_id": 1, "texts": { "english": "hello", "german": "hallo", "french": "bonjour" } }, … ] 的JS,但是找不到将我的值累积到对象中的方法。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

您可以在mongodb 3.4.4 及更高版本

中使用$map$arrayToObject聚合来尝试此操作

只需使用$map将具有键(k)的language字段和具有值(v)的文本转换,然后使用$arrayToObject将数组转换为对象即可

db.collection.aggregate([
  { "$addFields": {
    "texts": {
      "$map": {
        "input": "$texts",
        "in": {
          "k": "$$this.language",
          "v": "$$this.text"
        }
      }
    }
  }},
  { "$addFields": {
    "texts": { "$arrayToObject": "$texts" }
  }}
])

答案 1 :(得分:2)

您需要$map$arrayToObject来将k-v对数组转换为单个对象:

db.col.aggregate([
    {
        $addFields: {
            texts: {
                $arrayToObject: {
                    $map: {
                        input: "$texts",
                        as: "text",
                        in: {
                            k: "$$text.language",
                            v: "$$text.text"
                        }
                    }
                }
            }
        }
    }
])

答案 2 :(得分:2)

您还可以将$zip$arrayToObject结合使用。

类似

db.col.aggregate([{
  "$project": {
    "texts":{
     "$arrayToObject":{
       "$zip": {
        "inputs": [
          "$texts.language",
          "$texts.text"
        ]
      }
    }
  }}
}])