подсчитайте общее количество сгруппированных записей в конвейере с помощью golang mongodb

#mongodb #go

#mongodb #Вперед

Вопрос:

Я использую golang и mongodb.Ниже приведен мой код go

 matchStage := bson.M{"$match": bson.M{'country':'India'}}
groupByStage := bson.M{"$group": bson.M{
        "_id":             "$state",
        "city_count": bson.M{"$sum": 1},
    }}
pipeline := getCollection.Pipe([]bson.M{
        matchStage,
        groupByStage,
    })

 document := []bson.M{}
 err = pipeline.All(amp;document)
  

Я получаю каждое состояние с количеством городов, но я хочу получить общее количество сгруппированных состояний.Это только пример, но я хочу получить похожие данные.Итак, есть какое-либо решение, кроме цикла, для получения общего количества сгруппированных данных не для каждого количества сгруппированных данных?

Мой вывод похож на {'state1':3,'state2':4,'state3':1} , но я хочу только '3' as count

Ответ №1:

Прежде всего, похоже, что вы используете mgo или какую-то другую его версию. Я бы настоятельно рекомендовал вам использовать официальный драйвер go от mongodb.

Есть два подхода к ответу на ваш вопрос:

Если вы просто хотите подсчитать, разве это не то, что вам в принципе нужно:

 states := []string{}
err := getCollection.Find(bson.M{'country': 'India'}).Distinct("state", amp;states)
fmt.Printf("%dn", len(states))
  

Если вам нужно количество состояний вместе с количеством в каждом состоянии — возможно, добавьте вторую группу.

 matchStage := bson.M{"$match": bson.M{'country':'India'}}
groupByStage := bson.M{"$group": bson.M{
        "_id": bson.M{
                 "country": "$country",
                 "state": "$state",
        },
        "city_count": bson.M{"$sum": 1},
    }}
groupByStage2 := bson.M{"$group": bson.M{
        "_id": "$_id.country",
        "city_counts": bson.M{
            "$push": bson.M{
                 "state": "$_id.state",
                 "city_count": "$city_count",
             },
        },
        "state_count": bson.M{"$sum": 1},
    }}
pipeline := getCollection.Pipe([]bson.M{
        matchStage,
        groupByStage,
        groupByStage2,
    })

 document := []bson.M{}
 err = pipeline.All(amp;document)
  

Вы должны получить что-то вроде этого

 [{
    "_id": "India",
    "city_counts": [{'state1':3,'state2':4,'state3':1}],
    "state_count": 3
}]
  

Комментарии:

1. как мы можем извлечь данные из одного документа, используя document := bson.M{} или `var document interface{}`. Я просто хочу получить только количество и вернуться в ответ.