Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDb和Golang-小组前的比赛_Mongodb_Go - Fatal编程技术网

MongoDb和Golang-小组前的比赛

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

我正在尝试将我的事件列表$group进行$match,但没有成功。如果删除第一个
$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个月之间的匹配文档,这可能会有所不同。