MongoDb和Golang-在分组之前进行比赛

时间:2019-07-16 14:07:33

标签: mongodb go

我试图先 $ 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

1 个答案:

答案 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编写。