Mongodb Mogodb聚合从2个数组中创建输出为{“key”:“value”

Mongodb Mogodb聚合从2个数组中创建输出为{“key”:“value”,mongodb,nosql,mongodb-query,aggregation-framework,nosql-aggregation,Mongodb,Nosql,Mongodb Query,Aggregation Framework,Nosql Aggregation,我有一个关于如何从两个数组创建输出的问题,一个是带有翻译键的数组,另一个是带有翻译的数组 "translation_key":"value" 电流输出: { 输出应为: { "EN_en" :{ "HOUR_TEXT" :"hour", "DAY_TEXT" :"day", } } 您可以使用下面的聚合 您可以使用从两个数组中获取索引,并可以为结果数组创建键(k)和值(v)对,然后最终将结果数组转换为单个文档 db.collection.a

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

"translation_key":"value"  
电流输出:
{

输出应为:

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

您可以使用下面的聚合

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

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"
    }
  }
]

您可以尝试以下聚合:

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" }
        }
    }
])
基本上,您需要使用运算符来操作键名,在您的情况下,应该使用它两次。此运算符需要一个具有两个属性的对象数组
k
v
,因此您应该使用它来生成基于
translation
,用于生成要遍历
translata的索引的值TIONE
translation\u key
数组。然后,您可以使用将动态生成的密钥提升到文档的根级别

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" : { "hour" : "HOUR_TEXT", "day" : "DAY_TEXT" } }

我怎样才能做到这一点…从…{“EN_EN”:{“hour”:“hour_TEXT”,“day”:“day_TEXT”}{“ES_EN”:{“hour”:“hour_TEXT”,“day”:“day_TEXT”}到…{“EN”:{“key”:value},“ES”:{“key”:value}}您需要将多个文档推入
数组
{“0”:测试12:{“在大约一年内”:“}”,1:{“q23221312”:{“在大约一年内”:“}”,2:{“在大约一年内”:“}”,3:{“在大约一年内”:{“在大约一年内”:“在大约一年内”}怎么做?我以前写过一条评论吗o@Maco请打开一个单独的问题,以避免混淆,并让这个问题对未来的用户简单明了,我将尝试看看这个新问题