带有$lookup query的MGO管道赢得';t附上来自“的匹配文件”;加入;收集

带有$lookup query的MGO管道赢得';t附上来自“的匹配文件”;加入;收集,go,struct,aggregation-framework,mgo,Go,Struct,Aggregation Framework,Mgo,我的模型 类型( //Category在数据库中实现项目类别 类别结构{ ID bson.ObjectId`bson:“\u ID,省略空的”json:“ID”` 名称字符串`bson:“Name”json:“Name”表单:“Name”有效:“必需”` IsActive bool`bson:“is_active”json:“is_active”形式:“is_active”有效:“Required”` Slug字符串`bson:“Slug”json:“Slug”` 图标字符串`bson:“Ico

我的模型

类型(
//Category在数据库中实现项目类别
类别结构{
ID bson.ObjectId`bson:“\u ID,省略空的”json:“ID”`
名称字符串`bson:“Name”json:“Name”表单:“Name”有效:“必需”`
IsActive bool`bson:“is_active”json:“is_active”形式:“is_active”有效:“Required”`
Slug字符串`bson:“Slug”json:“Slug”`
图标字符串`bson:“Icon”json:“Icon”表单:“Icon”`
SidebarIcon字符串`bson:“侧边栏图标”json:“侧边栏图标”形式:“侧边栏图标”`
Parent bson.ObjectId`bson:“Parent,ommitempty”json:“Parent,ommitempty”形式:“Parent”`
CreatedAt time.time`bson:“在”json:“处创建”`
UpdatedAt time.time`bson:“在”json:“更新”`
IsDeleted bool`bson:“是否已删除”json:-“`
}
)
我的获取集合查询:

categories:=[]模型。类别{}
f:=func(集合*mgo.collection)错误{
查询:=[]bson.M{
{
“$match”:bson.M{
“是否已删除”:bson.M{
“$ne”:没错,
},
},
},
{
“$sort”:bson.M{
orderBy:pipeOrder,
},
},
{
“限额”:限额,
},
{
“$skip”:skip,
},
{
“$lookup”:bson.M{
“来自”:“类别”,
“localField”:“\u id”,
“foreignField”:“父项”,
“作为”:“父母名单”,
},
},
}
返回集合.Pipe(查询).All(&categories)
目标:如果父类别id与集合中的某个文档匹配,则检索所有类别及其父类别

问题:检索了所有类别,但缺少“parentlist”联接属性


堆栈:mgo要与DB和golang version 1.8进行交互

在聚合中,您查找父项,它们将存储在名为
父项列表
的字段中。您尝试将结果解组到
类别
的一个片段中,但类型
类别
没有与
父项列表匹配的字段。以便在解组过程中该字段将“丢失”

有许多方法可以获得附加的
父列表
,一些可能性在本答案中有详细说明:

一种选择是使用如下包装结构:

type CategoryWithParents struct {
    Category models.Category    `bson:",inline"`
    Parents  []*models.Category `bson:"parentlist"`
}
并将其分解成一片:

var results []CategoryWithParents

err := collection.Pipe(query).All(&results)
这将得到所有的父母

如果所有类别最多只能有一个父级,则可以将聚合修改为
$unwind
父级列表
,并且
父级可以是单个
*模型。类别
而不是切片:

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)
}

您可以解组为
类别
所有(&categories)
。什么是
类别
?@icza categories是一个数组,它将存储我从查询中获得的所有文档。请问您为什么不在此处使用嵌入?@MarkusWMahlberg没有特别的原因。它既适用于常规字段,也适用于嵌入字段。重要的是
,inline
bson标记选项。