1 回答

TA貢獻1878條經驗 獲得超4個贊
首先,Collection.Aggregate()
返回 a?mongo.Cursor
,而不是“直接”結果。您必須迭代游標才能獲取結果文檔(例如使用Cursor.Next()
和Cursor.Decode()
),或使用Cursor.All()
一步獲取所有結果文檔。
接下來,您沒有指定要求和的字段。您所擁有的是一個簡單的“計數”,它將返回已處理的文檔數量。要真正對一個字段求和,你可以這樣做
"sum":?bson.M{"$sum":?"$fieldName"}
讓我們看一個例子。假設我們在數據庫"example"
、集合中有以下文檔"checks"
:
{?"_id"?:?ObjectId("5dd6f24742be9bfe54b298cb"),?"payment"?:?10?} {?"_id"?:?ObjectId("5dd6f24942be9bfe54b298cc"),?"payment"?:?20?} {?"_id"?:?ObjectId("5dd6f48842be9bfe54b298cd"),?"payment"?:?4?}
這是我們計算支票并對付款求和的方法(payment
字段):
c := client.Database("example").Collection("checks")
pipe := []bson.M{
? ? {"$group": bson.M{
? ? ? ? "_id":? ?"",
? ? ? ? "sum":? ?bson.M{"$sum": "$payment"},
? ? ? ? "count": bson.M{"$sum": 1},
? ? }},
}
cursor, err := c.Aggregate(ctx, pipe)
if err != nil {
? ? panic(err)
}
var results []bson.M
if err = cursor.All(ctx, &results); err != nil {
? ? panic(err)
}
if err := cursor.Close(ctx); err != nil {
? ? panic(err)
}
fmt.Println(results)
這將輸出:
[map[_id: count:3 sum:34]]
結果是一個包含一個元素的切片,顯示3文檔已處理,并且(付款)總和為34。
- 1 回答
- 0 關注
- 168 瀏覽
添加回答
舉報