Ковыряю голанг и пытаюсь решить задачу, которая в 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 оказывается пустой массив. Если убрать, то запись приходит, но получаю ошибку, указанную выше. Возможно, что-то не так написал.