带有$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标记选项。