Mogodb聚合从2个数组

时间:2018-11-27 06:54:48

标签: mongodb nosql mongodb-query aggregation-framework nosql-aggregation

我有一个关于如何从2个数组创建输出的问题,一个带有翻译键的数组,另一个带有翻译的数组,我会输出为

"translation_key":"value"  

当前输出:
     {

        "_id" : ObjectId("5bfc0b2b30c4683f585078fb"),
        "translation" : [ 
            "hour", 
            "day"

        ],
        "translation_key" : [ 
            "HOUR_TEXT", 
            "DAY_TEXT"  


        ],
        "locale_id" : "EN_en"
   }

输出应为:

{
    "EN_en" :{
        "HOUR_TEXT" :"hour",
        "DAY_TEXT" :"day",
    }
}

2 个答案:

答案 0 :(得分:2)

您可以使用以下汇总

您可以使用$range从两个数组中获取索引,并可以为结果数组创建键(k)和值(v)对,然后最终$arrayToObject来转换结果排列成单个文档。

db.collection.aggregate([
  { "$replaceRoot": {
    "newRoot": {
      "$arrayToObject": [[
        {
          "k": "$locale_id",
          "v": {
            "$arrayToObject": {
              "$map": {
                "input": { "$range": [0, { "$size": "$translation_key" }] },
                "in": {
                  "k": { "$arrayElemAt": ["$translation_key", "$$this"] },
                  "v": { "$arrayElemAt": ["$translation", "$$this"] }
                }
              }
            }
          }
        }
      ]]
    }
  }}
])

返回哪个

[
  {
    "EN_en": {
      "DAY_TEXT": "day",
      "HOUR_TEXT": "hour"
    }
  }
]

答案 1 :(得分:2)

您可以尝试以下汇总:

db.col.aggregate([
    {
        $project: {
            array: [
                {
                    k: "$locale_id",
                    v: {
                        $arrayToObject: {
                            $map: {
                                input: { $range: [0, { $size: "$translation" }] },
                                as: "index",
                                in: {
                                    k: { $arrayElemAt: [ "$translation", "$$index" ] },
                                    v: { $arrayElemAt: [ "$translation_key", "$$index" ] }
                                }
                            }
                        }
                    }
                }
            ]
        }
    },
    {
        $replaceRoot: {
            newRoot: { $arrayToObject: "$array" }
        }
    }
])

基本上,您需要使用$arrayToObject运算符来操作您的密钥名称,在您的情况下,应使用两次。该运算符期望一个具有两个属性kv的对象数组,因此您应使用$map生成基于translation的值,使用$range生成遍历translationtranslation_key数组的索引。然后,您可以使用$replaceRoot将动态生成的密钥升级到文档的根级别。

输出:

{ "EN_en" : { "hour" : "HOUR_TEXT", "day" : "DAY_TEXT" } }