【问题标题】:How to perform aggregations in Go using mongo-driver如何使用 mongo-driver 在 Go 中执行聚合
【发布时间】:2019-12-28 17:39:47
【问题描述】:

我有一个包含 3 个字段的 MongoDB 集合:

_id: ObjectId
field1: Number
field2: Number

我正在执行此聚合以获取“不同”的 field1/field2 行并对结果进行总计数。这在客户端(Robo3t)中可以正常工作:

db.mycollection.aggregate([
    {
        $group: { 
            _id: { field1: "$field1", field2: "$field2" },
        }
    },
    { 
        $group: { 
            _id: null, count: { $sum: 1 } 
        } 
    }
])

结果:

{
    "_id" : null,
    "count" : 57.0
}

如何在 Go 中使用 mongo-driver 进行这种聚合?

this 方法可以执行聚合,但我不清楚文档。我知道我应该做一些 bson 查询,但我不知道从哪里开始。

【问题讨论】:

标签: mongodb go


【解决方案1】:
group :=[]bson.M{bson.M{
    "$group": bson.M{
        "_id":bson.M{
            "field1": "$field1",
            "field2": "$field2"
        }
    }
},
bson.M {
    "$group": bson.M{
        "_id":nil,
        "count": bson.M{
            "$sum":1
        }
    }
}
} 

cursor, err := coll.Aggregate(context.Background(), mongo.Pipeline{group})
if err != nil {
    log.Fatal(err)
}

试试上面的解决方法,会成功的。

【讨论】:

    【解决方案2】:

    为了补充公认的解决方案,我将与光标迭代和解码共享完整代码。我将"_id": nil 更改为"_id": "" 以接收字符串并能够毫无问题地解码为结构。

    pipeline := []bson.M{
        {
            "$group": bson.M{"_id": bson.M{"field1": "$field1", "field2": "$field2"}},
        },
        {
            "$group": bson.M{"_id": "", "count": bson.M{"$sum": 1}},
        },
    }
    
    cursor, err := coll.Aggregate(ctx, pipeline)
    if err != nil {
        return err
    }
    type Result struct {
        ID    string `bson:"_id"`
        Count int    `bson:"count"`
    }
    var res Result
    for cursor.Next(ctx) {
        err := cursor.Decode(&res)
        if err != nil {
            return err
        }
        fmt.Printf("Element %v", res)
    }
    

    【讨论】:

      猜你喜欢
      • 2019-05-21
      • 2021-04-28
      • 1970-01-01
      • 2020-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-17
      • 1970-01-01
      相关资源
      最近更新 更多