为了账号安全,请及时绑定邮箱和手机立即绑定

mongo-go-driver聚合查询总是返回“Current”:null

mongo-go-driver聚合查询总是返回“Current”:null

Go
鸿蒙传说 2023-08-07 11:22:18
我想通过使用来求和一个字段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有什么解决办法吗?
查看完整描述

1 回答

?
UYOU

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。


查看完整回答
反对 回复 2023-08-07
  • 1 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信