Как найти документ mongodb и применить локализацию?

У меня есть коллекция из нескольких тысяч персонажей. Каждый символ имеет восемь локализованных полей и девять поддерживаемых языков. Ниже приведен пример схемы, которую я использую, с примерами данных (только с документом меньшего размера).

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
        }
    }
])
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
67
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

хороший момент с $unset. Я использую $replalceRoot для объединения одного из объектов перевода на корневой уровень. Есть ли случайно ключевое слово $addFieldsToRoot?

Justin Thomas 27.02.2024 22:17
Ответ принят как подходящий
  1. $replaceRoot {newRoot { mergeObjects }} для объединения переводов.en на корневой уровень
  2. $unset для удаления переводов
db.characters.aggregate([
    {
        $match: {
            "key": 123
        }
    },
    {
        $replaceRoot: {
            newRoot: {
                $mergeObjects: ["$$ROOT", "$translations.en"]
            }
        }
    },
    {
        $unset: ["translations"]
    }
])

Другие вопросы по теме