gpt4 book ai didi

mongodb - 如何使用 MongoDB 在 Go 中聚合过去一小时内创建的数据?

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

我想聚合最近一小时创建的距离字段。

我得到的错误是:"missing type in composite literal"

我的代码:

var lastHour = time.Now()
var hour=lastHour.Hour()-1
pipeline := []bson.M{
{"$match": bson.M{"createdAt":{"$gt":hour} }},
{"$group":
bson.M{"_id": "",
"total distance": bson.M{ "$sum": "$distance" },
"maximum distance": bson.M{ "$max": "$distance" },
"minimum distance": bson.M{ "$min": "$distance" },
},
},

最佳答案

首先是你的错误信息

composite literal无效:

[]bson.M{
{"$match": bson.M{"createdAt":{"$gt":hour} }},
...

更具体地说,这部分:

bson.M{"createdAt":{"$gt":hour} }

因为 bson.M类型是:

type M map[string]interface{}

所以 bson.M 文字实际上是一个 map 文字,如果值的类型(在键值对中)与 map 类型的值类型不同,你必须明确地写出来。规范中提到了这一点:

Within a composite literal of array, slice, or map type T, elements or map keys that are themselves composite literals may elide the respective literal type if it is identical to the element or key type of T.

键值对:"createdAt: {"$gt":hour},这里的值是另一个bson.M的值,但是你没有提到它。此映射的值类型是 interface{},因此编译器无法猜测您希望它成为另一个 bson.M。您必须将其拼写为编译器。

正确的版本是:

bson.M{"createdAt": bson.M{"$gt":hour}}

这修复了编译时错误,但不会给您想要的结果。

现在开始你想要完成的任务

如果 createdAt 字段是 Date输入 MongoDB,然后传递值 time.Time过滤时。

对于传入的time.Time的值,计算1小时前(从当前时间算起)的时间值。为此,您可以使用 time.Add()方法,它添加给定的 time.Duration值到一个时间,并返回新的时间。持续时间可能是负的,以便及时返回。

它可能是这样的:

anHourAgo := time.Now().Add(-time.Hour)
pipeline := []bson.M{
{"$match": bson.M{"createdAt": bson.M{"$gt": anHourAgo}}},
{"$group": bson.M{
"_id": "",
"total distance": bson.M{"$sum": "$distance"},
"maximum distance": bson.M{"$max": "$distance"},
"minimum distance": bson.M{"$min": "$distance"},
}},
}

关于mongodb - 如何使用 MongoDB 在 Go 中聚合过去一小时内创建的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47544743/

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