mongo-go-driver 聚合查询始终返回 "Current" : null



我想使用对字段求和

pipeline := []bson.M{
bson.M{"$group": bson.M{
"_id": "", 
"count": bson.M{ "$sum": 1}}}
}
ctx, _ := context.WithTimeout(context.Background(), 5*time.Second)
result, err := collection.Aggregate(ctx, pipeline)

但它总是返回

"Current": null

有什么解决方案吗?

首先,Collection.Aggregate()返回一个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

最新更新