MongoDb和Golang-小组前的比赛
我正在尝试将我的事件列表与$group进行$match,但没有成功。如果删除第一个MongoDb和Golang-小组前的比赛,mongodb,go,Mongodb,Go,我正在尝试将我的事件列表与$group进行$match,但没有成功。如果删除第一个$match,则会得到结果 事件具有开始日期属性 我需要获得从2个月到现在开始的重复事件的ID。重复事件是指在同一时间在同一地点发生的事件 // Create the pipeline pipeline := []bson.M{ bson.M{ "$match": bson.M{ "start_date": bson.M{"$g
$match
,则会得到结果
事件具有开始日期属性
我需要获得从2个月到现在开始的重复事件的ID。重复事件是指在同一时间在同一地点发生的事件
// Create the pipeline
pipeline := []bson.M{
bson.M{
"$match": bson.M{
"start_date": bson.M{"$gt": time.Now().AddDate(0, -2, 0)},
},
},
bson.M{
"$group": bson.M{
"_id": bson.M{
"_location_id": "$_location_id",
"start_date": "$start_date",
},
"docs": bson.M{"$push": "$_id"},
"count": bson.M{"$sum": 1},
},
},
bson.M{
"$match": bson.M{
"count": bson.M{"$gt": 1.0},
},
},
}
我错过什么了吗
我签入了数据库,我确实有一些事件的开始日期与我的条件相匹配,请求是db.events.find({}).sort({“开始日期”:-1}).limit(1)代码>和那一个db.events.find({“开始日期”:{“$gt”:ISODate(“2019-05-16T00:00:00.0Z”)})。限制(1)
版本:MongoDB外壳版本v3.4.6
我签入了数据库,我确实有一些事件的开始日期与我的条件相匹配,并且符合该请求
默认情况下,并将任何本地时间表示形式转换为此窗体
这意味着,如果您在UTC+2
时区,您的查询过滤器默认为本地时间,但数据库中的文档是UTC。您需要将时间
转换为UTC。例如,集合中包含以下文档:
{ "start_date": ISODate("2019-05-27T00:00:00Z"), "location_id": 1 },
{ "start_date": ISODate("2019-05-28T00:00:00Z"), "location_id": 2 },
{ "start_date": ISODate("2019-05-24T00:00:00Z"), "location_id": 1 },
您可以对两个月前的日期执行$match
,如下所示:
pipeline := mongo.Pipeline{
{{"$match", bson.D{
{"start_date", bson.D{
{"$gt", time.Now().AddDate(0, -2, 0).UTC()},
},
},
}}},
}
cursor, err := collection.Aggregate(context.Background(), pipeline)
defer cursor.Close(context.Background())
for cursor.Next(context.Background()) {
var doc bson.M
err := cursor.Decode(&doc)
if err != nil {
log.Fatal(err)
}
fmt.Println(doc)
}
注意计算后到UTC
的转换。如果今天已经是2019年7月24日,那么查询将与第三个文档不匹配。相反,您需要在2个月和1天前查询
另一个技巧是,您可以通过打印管道来调试发送到服务器的日期,即:
fmt.Println(pipeline)
// [[{$match [{start_date [{$gt 2019-05-24 05:19:47.382049 +0000 UTC}]}]}]]
如果您有一个静态日期值,还可以按照以下示例构造日期(仍为UTC):
filterDate := time.Date(2019, 5, 24, 0, 0, 0, 0, time.UTC)
pipeline := mongo.Pipeline{
{{"$match", bson.D{
{"start_date", bson.D{
{"$gt", filterDate},
},
},
}}},
}
fmt.Println(pipeline)
上面的所有代码片段都是为v1.0.x编写的 你已经回答过自己了吗,你确定你有第一个匹配单独运行的数据吗?是的,我在执行此搜索时有数据:db.events.find({“开始日期”:{“$gt”:ISODate(“2019-05-16T00:00:00.0Z”)})。limit(1)
您确定要从事件
集合进行查询吗?另外time.Now()
使用本地时间,并且您声称有结果的查询使用UTC(可能有几个小时的差异)。@icza鉴于时间包括时区信息,我怀疑这与问题有关。@Adrian他的查询没有时区信息,它包含UTC时间戳。如果他只有介于2019-05-16T00:00:00.0
UTC和time.Now()-2个月之间的匹配文档,这可能会有所不同。