我正在尝试查询一个时间戳,该时间戳在两个其他时间戳之间。我已经有了这个简单的函数:
根据该函数,查询应只返回开始日期时间戳大于传入的
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"
。然而,假设数据库有三个事件,每个事件的开始日期如下:1474290000
、1474389000
、1474463700
。现在假设我传入一个 start
参数为 1474462800
,一个 end
参数为 1474491600
,我期望这个函数只会返回 1 个 "event"
,即时间戳为 1474463700
的那个,但它却返回了所有事件。无论我传入什么样的 start
和 end
参数,它都返回数据库中的所有内容。
更新:
如果我记录 .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 查询。 - algrebeexecutionStats.nReturned
的值为1,则应该考虑使用Count来交叉检查,以替换All
以检查它是否返回了3或1。 - algrebe