У меня есть коллекция из нескольких тысяч персонажей. Каждый символ имеет восемь локализованных полей и девять поддерживаемых языков. Ниже приведен пример схемы, которую я использую, с примерами данных (только с документом меньшего размера).
db.characters.insertMany([
{
"key": 123,
"attack": 1337,
"numberField3": 30
"translations": {
"en": {
"name": "Englishh name"
"description": "English description"
},
"es": {
"name": "Spanish name"
"description": "Spanish description"
}
}
},...
])
Как я могу сделать запрос, который возвращает документ, содержащий нелокализованные поля и локализованные поля с указанного языка?
псевдозапрос: db.characteres.find({"key":123}).addAll("translations.en") вернет:
{
"key": 123,
"attack": 1337,
"numberField3": 30
"name": "Englishh name"
"description": "English description"
}
Спасибо, что посмотрели на это. Впервые пользуюсь mongodb и нуб в моделировании данных. ОБНОВЛЯТЬ Я только что нашел пример (спасибо
db.characters.aggregate([
{
$match: {
"key": 123
}
},
{
$project: {
"_id": 0,
"key": 1,
"attack": 1,
"numberField3": 1,
"name": "$translations.en.name",
"description": "$translations.en.description"
}
}
])
ОБНОВЛЕНИЕ № 2 После дальнейших расспросов
db.characters.aggregate([
{
$match: {
"key": 123
}
},
{
$replaceRoot: {
newRoot: {
$mergeObjects: ["$$ROOT", "$translations.en"]
}
}
},
{
$project: {
"translations": 0
}
}
])




$project в вашем конвейере не даст ожидаемого результата: он просто вернет _id документа, вот и все. Для этого вам нужно использовать $unset.
Потенциально более быстрая агрегация может быть достигнута с помощью $addFields. Это объединит два последних шага конвейера (синтаксис не проверен, но должен дать подсказку):
b.characters.aggregate([
{
$match: {
"key": 123
}
},
{
$addFields: {
translations: "$translations.en"
}
}
])
Если вы хотите другое имя:
b.characters.aggregate([
{
$match: {
"key": 123
}
},
{
$addFields: {
translation: "$translations.en"
}
},
{
$unset: "translations"
}
])
db.characters.aggregate([
{
$match: {
"key": 123
}
},
{
$replaceRoot: {
newRoot: {
$mergeObjects: ["$$ROOT", "$translations.en"]
}
}
},
{
$unset: ["translations"]
}
])
хороший момент с $unset. Я использую $replalceRoot для объединения одного из объектов перевода на корневой уровень. Есть ли случайно ключевое слово $addFieldsToRoot?