如何使用golang对mongodb中具有相同user_id的集合数据进行分组?

时间:2018-04-03 05:21:35

标签: mongodb go mgo

我正在尝试使用golang来计算具有相同user_id的产品的价格总和。但我不知道怎么会得到这个。我在以下代码中尝试了$group

产品结构

type Product struct {
  Id         int     `json:"id" bson:"_id"`
  Name       string  `json:"name" bson:"name"`
  Sku        string  `json:"sku" bson:"sku"`
  Category   string  `json:"category" bson:"category"`
  Stock      int     `json:"stock" bson:"stock"`
  Price      float64 `json:"price" bson:"price"`
  Sale_price float64 `json:"sale_price" bson:"sale_price"`
  UpdatedOn  int64   `json:"updated_on" bson:"updated_on"`
  UserId     int     `json:"user_id" bson:"user_id"`
}

客户的结构

type Customer struct {
  Id               int    `json:"id" bson:"_id"`
  FirstName        string `json:"first_name" bson:"first_name"`
  LastName         string `json:"last_name" bson:"last_name"`
  Email            string `json:"email" bson:"email"`
  PhoneNumber      string `json:"phone_number" bson:"phone_number"`
}

数据将从哪里检索

func GetProducts(c *gin.Context) {
    mongoSession := config.ConnectDb()                                         //connection to database
    collection := mongoSession.DB(config.Database).C(config.ProductCollection) //session
    pipeline := []bson.M{
        bson.M{"$group": bson.M{"user_id": 1}}, bson.M{"$sum": bson.M{"price": "price"}},
    } //query i tried
    fmt.Println(pipeline)
    pipe := collection.Pipe(pipeline)
    resp := []bson.M{}
    err = pipe.All(&resp)
    if err != nil {
        fmt.Println("Errored: %#v \n", err)
    }
    fmt.Println(resp)
    GetResponseList(c, response)
}

图片中查看的数据 -

在上图中,产品的user_id是相同的。我想对这些数据进行分组并计算price

我还阅读了Mongodb this one的文档但是不明白如何在golang中做任何人都可以用简单的方式解释它如何进行查询。感谢

1 个答案:

答案 0 :(得分:0)

使用$group进行分组时,您必须使用特殊的_id属性来说明要分组的内容。

在引用现有的属性/字段时,您必须在其名称前面使用$符号,例如$user_id

除了_id之外,您还可以列出其值可能是某些汇总值的其他属性(例如$sum)。

这就是你的管道的样子:

pipeline := []bson.M{
    {
        "$group": bson.M{
            "_id":       "$user_id",
            "sum_price": bson.M{"$sum": "$price"},
        },
    },
}