Go中MongoDB $and逻辑运算符查询失效问题求助
问题排查与修复
你的问题出在两个关键地方:
end条件的运算符漏了$符号
MongoDB的比较运算符必须以$开头,你代码里的lte应该写成$lte,否则会被当成普通字段名匹配,自然查不到符合时间范围的结果。没必要显式使用$and
MongoDB的查询条件默认就是逻辑AND关系,多个键值对会自动按AND规则组合,显式写$and反而会增加结构复杂度,容易引发不必要的语法错误。
修正后的代码(推荐写法)
// Specify the filter filter := bson.D{ {"start", bson.D{{"$gte", datamap.Schedule.Start}}}, {"end", bson.D{{"$lte", datamap.Schedule.End}}}, {"userid", datamap.Schedule.UserID}, } cursor, err := collection.Find(context.TODO(), filter) if err != nil { panic(err) }
若坚持显式使用$and的正确写法
如果你一定要保留$and的显式写法,除了补全$lte的$符号,还要确保整体结构正确:
// Specify the filter filter := bson.D{ { "$and", bson.A{ bson.D{{"start", bson.D{{"$gte", datamap.Schedule.Start}}}}, bson.D{{"end", bson.D{{"$lte", datamap.Schedule.End}}}}, // 补全$符号 bson.D{{"userid", datamap.Schedule.UserID}}, }, }, } cursor, err := collection.Find(context.TODO(), filter) if err != nil { panic(err) }
为什么单个条件能生效?
你单独测试每个条件时应该是写对了运算符(比如单独测end条件时用了$lte),但组合到$and里时漏写了$符号,导致end条件变成了匹配end字段等于包含lte键的文档,而非时间范围匹配,所以整体查询无结果。
内容的提问来源于stack exchange,提问作者nate fishel
相关产品推荐
相关产品推荐

