Golang mgo获取大于和小于时间戳。

3
我正在尝试查询一个时间戳,该时间戳在两个其他时间戳之间。我已经有了这个简单的函数:
func (e *EventService) GetEmployeeEventsBetween(employeeID string, start, end int64) ([]Event, error) {
    var retrivedEvents []Event
    if err := e.c().Find(bson.M{
        "employee": employeeID,
        "start":    bson.M{"$gte": start, "$lte": end},
    }).All(&retrivedEvents); err != nil {
        return nil, err
    }

    return retrivedEvents, nil
}

根据该函数,查询应只返回开始日期时间戳大于传入的 start 时间戳并且小于传入的 end 时间戳的 "events"。然而,假设数据库有三个事件,每个事件的开始日期如下:147429000014743890001474463700。现在假设我传入一个 start 参数为 1474462800,一个 end 参数为 1474491600,我期望这个函数只会返回 1 个 "event",即时间戳为 1474463700 的那个,但它却返回了所有事件。无论我传入什么样的 startend 参数,它都返回数据库中的所有内容。 更新: 如果我记录 .Explain(),则会得到以下结果。
bson.M{
    "queryPlanner": bson.M{
    "plannerVersion":1, 
    "namespace":"hairbuddy.events", 
    "indexFilterSet":false, 
    "parsedQuery": bson.M{
        "$and":[]interface {}{
            bson.M{
                "employee": bson.M{"$eq":"57c36bdfe5b07e10ae5526ee"}
            }, 
            bson.M{
                "start":bson.M{"$lte":1474491600}
            }, 
            bson.M{
                "start": bson.M{"$gte":1474462800}
            }
        }
    }, 
    "winningPlan": bson.M{
        "inputStage": bson.M{
            "stage":"COLLSCAN", 
            "filter": bson.M{
                "$and":[]interface {}{
                    bson.M{
                        "employee": bson.M{"$eq":"57c36bdfe5b07e10ae5526ee"}
                    }, 
                    bson.M{
                        "start": bson.M{"$lte":1474491600}
                    }, 
                    bson.M{
                        "start":bson.M{"$gte":1474462800}
                    }
                }
            }, 
            "direction":"forward"
        }, 
        "stage":"LIMIT", 
        "limitAmount":40
    }, 
    "rejectedPlans":[]interface {}{}
    }, 
    "executionStats": bson.M{
        "totalDocsExamined":3, 
        "executionStages": bson.M{
            "restoreState":0, 
            "isEOF":1, 
            "invalidates":0, 
            "inputStage": bson.M{
                "restoreState":0,
                "direction":"forward", 
                "stage":"COLLSCAN", 
                "executionTimeMillisEstimate":0, 
                "works":5, 
                "needYield":0, 
                "nReturned":1, 
                "advanced":1, "isEOF":1, 
                "docsExamined":3, 
                "filter": bson.M{
                    "$and":[]interface {}{
                        bson.M{
                            "employee": bson.M{"$eq":"57c36bdfe5b07e10ae5526ee"}
                        }, 
                        bson.M{
                            "start": bson.M{"$lte":1474491600}
                        }, 
                        bson.M{
                            "start": bson.M{"$gte":1474462800}
                        }
                    }
                }, 
                "needTime":3, 
                "saveState":0, 
                "invalidates":0
            }, 
            "stage":"LIMIT", 
            "advanced":1, 
            "needYield":0, 
            "saveState":0, 
            "limitAmount":40, 
            "nReturned":1, 
            "executionTimeMillisEstimate":0, 
            "works":5, 
            "needTime":3
        }, 
        "allPlansExecution":[]interface {}{}, 
        "executionSuccess":true, 
        "nReturned":1, 
        "executionTimeMillis":0, 
        "totalKeysExamined":0
    }, 
    "serverInfo": bson.M{
        "version":"3.2.7", 
        "gitVersion":"4249c1d2b5999ebbf1fdf3bc0e0e3b3ff5c0aaf2", 
        "host":"rodrigos-MacBook-Pro.local", 
        "port":27017
    }, 
    "ok":1,
}

你可以尝试将 All 替换为 explain,以查看正在执行的 MongoDB 查询。 - algrebe
稍微缩进一下,如果您查看 executionStats.nReturned 的值为1,则应该考虑使用Count来交叉检查,以替换All以检查它是否返回了3或1。 - algrebe
@algrebe 哇,谢谢你!我一度认为自己疯了,因为计数器等于1,但当我检查我的API调用时,它却拥有了所有的事件,我意识到我在代码中有一个错误,导致调用了获取所有事件并返回了它。 - Rodrigo
没问题。不过我不确定如何为此提供答案。您可能最清楚。 - algrebe
1个回答

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接