Вы можете попробовать выполнить агрегацию ниже:
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 для манипулирования именами ключей, и в вашем случае его следует использовать дважды.Этот оператор ожидает массив объектов с двумя свойствами k
и v
, и поэтому вы должны использовать $ map для генерации значений, основанных на translation
, $ range генерировать индексы для обхода массивов translation
и translation_key
.Затем вы можете использовать $ replaceRoot для продвижения динамически сгенерированного ключа на корневой уровень вашего документа.
Вывод:
{ "EN_en" : { "hour" : "HOUR_TEXT", "day" : "DAY_TEXT" } }