问题内容 我有一个包含事件的集合。每个事件都有精确到毫秒的时间戳。我想将每天的事件分组。 例如: 我有 key value _id 1112223334445
我有一个包含事件的集合。每个事件都有精确到毫秒的时间戳。我想将每天的事件分组。 例如:
我有
key value
_id 111222333444555DDD666fff
time 2023-04-23t15:35:19.631z
type pizza-event
_id 111222333444555ddd666fff
time 2023-04-23t01:41:20.631z
type tv-event
_id 111222333444555ddd666fff
time 2023-04-22t05:00:05.631z
type some-event
我愿意
key value
date 04-22-2023
count 1.0
date 04-23-2023
count 2.0
到目前为止我已经
[
{
"$match" : {
"$and" : [
{
"type" : "foo.bar.event"
},
{
"time" : {
"$gte" : isodate("2023-04-23t00:00:00.000+0000")
}
},
{
"time" : {
"$lte" : isodate("2023-04-25t00:00:00.000+0000")
}
}
]
}
},
{
"$group" : {
"_id" : {
"$datetostring" : {
"fORMat" : "%m-%d-%y",
"date" : "$time"
}
},
"count" : {
"$sum" : 1.0
}
}
}
]
返回
key value
_id 04-24-2023
count 476.0
_id 04-23-2023
count 28.0
这本来可以工作,但是当我在 Go 项目中编写此查询时,“$datetostring”下会出现红色波浪线,并显示消息“无效的字段名称”,理想情况下我希望日期有一个“时间”键而不是“_id”。当我在小组赛阶段进行以下更改时:
{
_id: null,
"date": {"$dateToString": { "format": "%m-%d-%Y", "date": "$time"}},
"count": {"$sum": 1}
}
我收到未知组运算符“$datetostring”错误。因此,我想到创建组,然后为“$datetostring”添加一个项目阶段,但现在小组阶段每毫秒都会返回组,这违背了分组的目的。
我意识到我正在讨论两个不同的问题。然而,虽然一切方面的帮助都会很棒,但这个问题具体是关于修复 mongo 查询的。如果有必要,我会在另一个线程上返回 golang 编码。 如果我能说得更清楚,请告诉我。
首先,如果您有一个应用程序 ui 来显示查询结果,则不必费心格式化查询中的输出。这是应用程序 ui 的职责。顺便说一句,如果您有应用程序 ui,请考虑使用 $datetrunc
而不是 $datetostring
。
无论如何,关于您问题中的要求,像这样的 $project
阶段应该适合您:
[
{
"$group": {
"_id": {
"$datetostring": { "date": "$time", "format": "%m-%d-%y" }
},
"count": { "$sum": 1 }
}
},
{ "$project": { "_id": 0, "time": "$_id", "count": "$count" } }
]
{ "time" : "02-08-2020", "count" : 2 }
{ "time" : "05-18-2020", "count" : 2 }
{ "time" : "03-20-2021", "count" : 3 }
{ "time" : "01-11-2021", "count" : 1 }
关于在go项目中使用查询,这里有一个演示:
package main
import (
"context"
"fmt"
"time"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second)
defer cancel()
client, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://localhost:27017"))
if err != nil {
panic(err)
}
coll := client.Database("baz").Collection("cakeSales")
matchStage := bson.D{
{"$match", bson.D{
{"$and", []bson.D{
{{"time", bson.D{
{"$gte", time.Date(2019, 6, 1, 0, 0, 0, 0, time.UTC)},
}}},
{{"time", bson.D{
{"$lte", time.Date(2021, 2, 1, 0, 0, 0, 0, time.UTC)},
}}},
}},
}},
}
groupStage := bson.D{
{"$group", bson.D{
{"_id", bson.D{
{"$dateToString", bson.D{
{"date", "$time"},
{"format", "%m-%d-%Y"},
}},
}},
{"count", bson.D{
{"$sum", 1},
}},
}},
}
projectStage := bson.D{
{"$project", bson.D{
{"_id", 0},
{"time", "$_id"},
{"count", "$count"},
}},
}
cursor, err := coll.Aggregate(context.TODO(),
mongo.Pipeline{matchStage, groupStage, projectStage})
if err != nil {
panic(err)
}
var results []bson.M
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
fmt.Printf(
"time: %s count: %v\n",
result["time"],
result["count"])
}
}
以上就是检索 MongoDB 聚合上每个日期的项目计数的详细内容,更多请关注编程网其它相关文章!
--结束END--
本文标题: 检索 MongoDB 聚合上每个日期的项目计数
本文链接: https://lsjlt.com/news/561421.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0