我试图先 $ match 我的事件列表,然后再 $ group ,但这是行不通的。如果删除第一个$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},
},
},
}
我想念什么吗?
我签入了数据库,并且确实有一个事件start_date
与我的条件匹配,并且请求db.events.find({}).sort({ "start_date": -1}).limit(1);
和那个db.events.find({"start_date": { "$gt": ISODate("2019-05-16T00:00:00.0Z")}}).limit(1)
版本:MongoDB Shell版本v3.4.6
答案 0 :(得分:0)
我签入了数据库,但确实有一些事件的开始日期与我的条件匹配,并且符合该请求
MongoDB stores time in UTC默认情况下,并将所有本地时间表示形式转换为这种形式。
这意味着,如果您处于UTC+2
时区,则查询过滤器默认为本地时间,而数据库中的文档为UTC。您需要将time
转换为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个月零一天前进行查询。
另一个提示是,您可以通过打印pipeline
来调试发送到服务器的日期,即:
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)
以上所有摘录均针对MongoDB Go driver v1.0.x编写。