Несколько агрегатных запросов верхнего уровня в конвейере MongoDB - PullRequest
1 голос
/ 06 августа 2020

У меня следующий запрос:

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

У меня есть два реляционных поля, одно из них представляет собой структуру графика (меню), каждый родительский элемент имеет массив идентификаторов для каждого дочернего элемента.

Второе поле, метки, представляет собой запрос типа "один ко многим". Ярлыки и меню должны использоваться повторно, поэтому они не могут быть встроены в единую родительскую сущность. Вышеуказанный запрос имеет смысл для меня, однако я получаю следующую ошибку:

A pipeline stage specification object must contain exactly one field.

Спасибо!

1 Ответ

1 голос
/ 07 августа 2020

Каждый элемент в конвейере MongoDB должен быть одноступенчатым, например $match, $group et c.

Ваш элемент group содержит 2 этапа: $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})
...