gpt4 book ai didi

mongodb - Golang mgo 返回带有聚合 $group 的值

转载 作者:IT王子 更新时间:2023-10-29 00:45:10 25 4
gpt4 key购买 nike

如何获取聚合查询以返回 $group 语句中使用的字段值。

代码:

type TheGroup struct{
Id bson.ObjectId `json:"id,omitempty" bson:"_id,omitempty"`
Totalamount int
Dayofyear int
Actualyear string
Transactiondate string
Count int
}

var results []TheGroup

o1 := bson.M{"$match" :bson.M{"transactiontype": transactiontype},}
o2 := bson.M{"$group" : bson.M{"_id": bson.M{"day": "$dayofyear", "year":"$actualyear"},"totalamount":bson.M{"$sum":"$qty"}, "count":bson.M{"$sum":1}},}
operations := []bson.M{o1, o2}
pipe := collection.Pipe(operations)
err1 := pipe.All(&results)

if err := json.NewEncoder(w).Encode(results); err != nil {
panic(err)
}

输出如下:

[{"Totalamount":2061,"Dayofyear":0,"Actualyear":"","Transactiondate":"","Count":679},{"Totalamount":8705,"Dayofyear":0,"Actualyear":"","Transactiondate":"","Count":2145},{"Totalamount":8156,"Dayofyear":0,"Actualyear":"","Transactiondate":"","Count":2806},{"Totalamount":9865,"Dayofyear":0,"Actualyear":"","Transactiondate":"","Count":3294},{"Totalamount":9619,"Dayofyear":0,"Actualyear":"","Transactiondate":"","Count":3102},{"Totalamount":9975,"Dayofyear":0,"Actualyear":"","Transactiondate":"","Count":3457},{"Totalamount":14839,"Dayofyear":0,"Actualyear":"","Transactiondate":"","Count":4036},{"Totalamount":5100,"Dayofyear":0,"Actualyear":"","Transactiondate":"","Count":1699},{"Totalamount":9649,"Dayofyear":0,"Actualyear":"","Transactiondate":"","Count":2854},{"Totalamount":11457,"Dayofyear":0,"Actualyear":"","Transactiondate":"","Count":3220},{"Totalamount":12643,"Dayofyear":0,"Actualyear":"","Transactiondate":"","Count":3860},{"Totalamount":10301,"Dayofyear":0,"Actualyear":"","Transactiondate":"","Count":3620},{"Totalamount":7681,"Dayofyear":0,"Actualyear":"","Transactiondate":"","Count":2816},{"Totalamount":8130,"Dayofyear":0,"Actualyear":"","Transactiondate":"","Count":3023}]

我想我明白为什么 Dayofyear/Actualyear 没有被填充——因为没有文档值的聚合,因为匹配的文档被 $group 遍历——但是我如何让它们填充?

最佳答案

在 mongo shell 中运行以下管道应该会得到正确的结果:

pipeline = [
{
"$match": { "transactiontype": transactiontype }
},
{
"$group": {
"_id": {
"year": { "$year": "$transactiondate" },
"dayOfYear": { "$dayOfYear": "$transactiondate" }
},
"totalamount": { "$sum": "$qty" },
"count": { "$sum": 1 },
"date": { "$first": "$transactiondate"}
}
},
{
"$project": {
"_id": 0,
"totalamount": 1,
"dayOfYear": "$_id.dayOfYear",
"actualyear": { "$substr": [ "$_id.year", 0, 4 ] },
"transactiondate": {
"$dateToString": { "format": "%Y-%m-%d %H:%M", "date": "$date" }
},
"count": 1
}
}
]
db.collection.aggregate(pipeline)

其中等效的 mGo 表达式如下(未经测试):

pipeline := []bson.M{   
bson.M{
"$match": bson.M{ "transactiontype": transactiontype }
},
bson.M{
"$group": bson.M{
"_id": bson.M{
"year": bson.M{ "$year": "$transactiondate" },
"dayOfYear": bson.M{ "$dayOfYear": "$transactiondate" }
},
"totalamount": bson.M{ "$sum": "$qty" },
"count": bson.M{ "$sum": 1 },
"date": bson.M{ "$first": "$transactiondate"}
}
},
bson.M{
"$project": bson.M{
"_id": 0,
"totalamount": 1,
"dayOfYear": "$_id.dayOfYear",
"actualyear": bson.M{ "$substr": []interface{}{ "$_id.year", 0, 4 } },
"transactiondate": bson.M{
"$dateToString": bson.M{ "format": "%Y-%m-%d %H:%M", "date": "$date" }
},
"count": 1
}
}
}

pipe := collection.Pipe(pipeline)

关于mongodb - Golang mgo 返回带有聚合 $group 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35415604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com