@AndrewRusinas

Агрегация полей из MongoDB в Golang?

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

Необходимость написания огромного количества кода ради столько простой задачи немного frustrating, но изучать новое всегда интересно.

Если говорить более детально, то задача, которую я пытаюсь решить, выглядит так: нужно получить один документ из коллекции, заменив поле category, которое имеет тип ObjectID (в struct это string для удобства работы с ним в коде), на запись из другой коллекции с таким _id.

Проблема, с которой я столкнулся, выглядит следующим образом.

Я имею достаточной простой `struct` для записи в блоге:
type Post struct {
    ID          primitive.ObjectID       `json:"_id" bson:"_id,omitempty"`
    Title       *string                  `json:"title" bson:"title"`
    Slug        *string                  `json:"slug" bson:"slug"`
    Content     []map[string]interface{} `json:"content" bson:"content,omitempty"`
    Category    *string                  `json:"category" bson:"category,omitempty"`
}


Создаю следующий пайплайн:
match := bson.D{
    {
        "$match", bson.D{
            {
                "slug", slug,
            },
        },
    },
}

lookup := bson.D{
    {
        "$lookup", bson.D{
            {
                "from", categories.Model_name,
            },
            {
                "localField", "category",
            },
            {
                "foreignField", "_id",
            },
            {
                "as", "category",
            },
        },
    },
}

unwind := bson.D{
    {
        "$unwind", bson.D{
            {
                "path", "$category",
            },
        },
    },
}

cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{match, lookup, unwind})

var results []Post
if err = cursor.All(context.TODO(), &results); err != nil {
    panic(err)
}


Но получаю ошибку
panic: error decoding key category: cannot decode array into a string type.
Ошибка ясна - теперь у меня вместо строки в поле category возвращается другой тип данных. Но как это решать? Данный struct используется и в других методах, где category возвращается просто строкой, и это важно - я не могу просто поменять тип данных в стракте. Плюс в других методах я могу агрегировать другие поля. Что делать? Создавать свой struct для каждого метода? Выглядит тупо и неэффективно. Наверняка есть иное решение.

Так же не уверен на счет стадии $unwind. Когда я её добавляю в pipeline, в results оказывается пустой массив. Если убрать, то запись приходит, но получаю ошибку, указанную выше. Возможно, что-то не так написал.
  • Вопрос задан
  • 264 просмотра
Пригласить эксперта
Ваш ответ на вопрос

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

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