#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{}`. Я просто хочу получить только количество и вернуться в ответ.