@AndrewRusinas

Как использовать $lookup в MongoDB для массивов?

У меня есть три коллекции, Posts, Languages и Translations. Структура примерно такая:
Post: {
    id: ObjectID
    title: String,
    translated_versions: ObjectID
}

TranslatedVersion: {
    id: ObjectID
    translations: Translation[]
}

// Не коллекция, просто структура объекта внутри TranslatedVersion.translations
Translation: {
    post: ObjectID
    language: ObjectID
}

Language {
    id: ObjectID
    name: String
}


При получении поста я хочу получить TranslatedVersion по id, затем для каждой записи внутри TranslatedVersion.translations я хочу получить объект языка и объект поста, то есть примерно такую структуру получить на выходе:
Post {
    title: "Test title",
    translated_versions: {
        id: 'some-id',
        tranlations: [
            Translation {
                language: {
                    id: 'some-id',
                    name: 'Turkish'
                },
                post: {
                    id: 'some-id'
                    title: 'Turkish post'
                }
            },
            Translation {
                language: {
                    id: 'some-id',
                    name: 'English'
                },
                post: {
                    id: 'some-id',
                    title: 'English post'
                }
            }
        ]
    }
}


Сейчас для этого я пытаюсь использовать несколько стадий lookup и unwind, но на выходе получаю не совсем тот результат, который нужен.

Golang:
lookup_translations_group := bson.D{
        {
            Key: "$lookup", Value: bson.D{
                {
                    Key: "from", Value: Models.Translation,
                },
                {
                    Key: "localField", Value: "translations_group_id",
                },
                {
                    Key: "foreignField", Value: "_id",
                },
                {
                    Key: "as", Value: "translations",
                },
            },
        },
    }


unwind_translations_group := bson.D{
        {
            Key: "$unwind", Value: bson.D{
                {
                    Key: "path", Value: "$translations",
                },
                {
                    Key: "preserveNullAndEmptyArrays", Value: true,
                },
            },
        },
    }


lookup_translations_posts := bson.D{
        {
            Key: "$lookup", Value: bson.D{
                {
                    Key: "from", Value: Models.Post,
                },
                {
                    Key: "localField", Value: "translations.translations.post",
                },
                {
                    Key: "foreignField", Value: "_id",
                },
                {
                    Key: "as", Value: "translations.translations.post",
                },
            },
        },
    }


Однако, на выходе у меня получается вот такая структура:
eJzNt.png

Очевидно, что мой пайплайн получается косячный, но я не могу понять, как сделать это правильно
  • Вопрос задан
  • 279 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы