В вашей совокупности вы ищите родителей, и они будут храниться в поле с именем parentlist
.И вы пытаетесь распаковать результаты в срез Category
, но у типа Category
нет поля, которое бы соответствовало parentlist
.Таким образом, это поле будет «потеряно» в процессе демаршалинга.
Есть много способов получить дополнительные parentlist
, некоторые из возможностей подробно описаны в этом ответе: Агрегация Mgo: как использовать повторнотипы моделей для запроса и демарширования «смешанных» результатов?
Один из вариантов - использовать структуру-обертку, например, такую:
type CategoryWithParents struct {
Category models.Category `bson:",inline"`
Parents []*models.Category `bson:"parentlist"`
}
И демонтировать в кусок этого:
var results []CategoryWithParents
err := collection.Pipe(query).All(&results)
Получат все родители.
Если для всех категорий может быть не более одного родителя, вы можете изменить агрегацию на $unwind
, parentlist
и Parents
может быть одним *model.Category
вместо среза:
type CategoryWithParents struct {
Category models.Category `bson:",inline"`
OptionalParent *models.Category `bson:"parentlist"`
}
var results []CategoryWithParents
f := func(collection *mgo.Collection) error {
query := []bson.M{
{
"$match": bson.M{
"is_deleted": bson.M{
"$ne": true,
},
},
},
{
"$sort": bson.M{
orderBy: pipeOrder,
},
},
{"$limit": limit},
{"$skip": skip},
{
"$lookup": bson.M{
"from": "categories",
"localField": "_id",
"foreignField": "parent",
"as": "parentlist",
},
},
{
"$unwind": bson.M{
"path": "parentlist",
"preserveNullAndEmptyArrays": true,
},
},
}
return collection.Pipe(query).All(&results)
}