mongo-go-driver 聚合查询总是return "Current": null
mongo-go-driver aggregate query always return "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)
但总是return
"Current": null
有什么解决办法吗?
首先,Collection.Aggregate()
returns a mongo.Cursor
, not the "direct" result. You have to iterate over the cursor to get the result documents (e.g. with Cursor.Next()
and Cursor.Decode()
), or use Cursor.All()
一步获取所有结果文档。
接下来,您没有指定要对哪个字段求和。您拥有的是一个简单的 "counting",它将 return 处理的文档数。要真正对一个字段求和,您可以使用
"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
。
我想使用
对一个字段求和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)
但总是return
"Current": null
有什么解决办法吗?
首先,Collection.Aggregate()
returns a mongo.Cursor
, not the "direct" result. You have to iterate over the cursor to get the result documents (e.g. with Cursor.Next()
and Cursor.Decode()
), or use Cursor.All()
一步获取所有结果文档。
接下来,您没有指定要对哪个字段求和。您拥有的是一个简单的 "counting",它将 return 处理的文档数。要真正对一个字段求和,您可以使用
"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
。