MongoDB管道中的多个顶级聚合查询

时间:2020-08-06 11:04:09

标签: mongodb go aggregation-framework mongo-go

我有以下查询:

match := bson.D{{"$match", bson.D{{"venue", venueID}}}}
group := bson.D{{"$lookup", bson.M{
    "from":         "labels",
    "localField":   "label_ids",
    "foreignField": "_id",
    "as":           "labels",
}}, {"$graphLookup", bson.M{
    "from":             "menus",
    "startWith":        "$child_ids",
    "connectFromField": "child_ids",
    "connectToField":   "_id",
    "as":               "children",
    "maxDepth":         5,
    "depthField":       "level",
}}}

cur, err := m.collection.Aggregate(ctx, mongo.Pipeline{group, match})

我有两个相关的字段,其中一个是图形结构(菜单),每个父元素都有一个ID数组,用于每个子元素。

第二个字段,标签,只是一对多的查询。标签和菜单应该是可重用的,因此不能嵌入单个父实体中。上面概述的查询对我来说很有意义,但是出现以下错误:

A pipeline stage specification object must contain exactly one field.

谢谢!

1 个答案:

答案 0 :(得分:1)

MongoDB管道中的每个元素都必须是单个阶段,例如$match$group

您的group元素包含两个阶段:$lookup$graphLookup

将它们拆分并单独列出:

match := bson.D{{"$match", bson.D{{"venue", venueID}}}}
group := bson.D{{"$lookup", bson.M{
    "from":         "labels",
    "localField":   "label_ids",
    "foreignField": "_id",
    "as":           "labels",
}}}
graphLookup := bson.D{{"$graphLookup", bson.M{
    "from":             "menus",
    "startWith":        "$child_ids",
    "connectFromField": "child_ids",
    "connectToField":   "_id",
    "as":               "children",
    "maxDepth":         5,
    "depthField":       "level",
}}}

cur, err := m.collection.Aggregate(ctx, mongo.Pipeline{group, graphLookup, match})