Mongo-go-driver嵌套查询优化问题:合并双查询过滤器失败求助
修复你的MongoDB合并过滤器问题
我来帮你找出问题所在并搞定这个查询~
首先看你写的合并过滤器,问题出在语法结构和逻辑层级上:你把$and和$or直接放在了顶级的bson.M里,这不符合MongoDB的查询语法规则,而且还重复写了unlocked和deletedAt的条件,完全是多余的。
你的需求其实很清晰:要查询同时满足unlocked: false、deletedAt: nil,并且要么partnerA.id等于目标id,要么partnerB.id等于目标id的文档。正确的逻辑应该是把公共条件和$or条件都放在外层的$and中,这样结构才合理。
正确的合并过滤器写法:
filter := bson.M{ "$and": []bson.M{ {"unlocked": false}, {"deletedAt": nil}, {"$or": []bson.M{ {"partnerA.id": id}, {"partnerB.id": id}, }}, }, }
逻辑拆解:
- 外层的
$and确保三个条件同时成立:- 文档的
unlocked字段为false - 文档的
deletedAt字段为nil(也就是不存在或者为null) - 满足
partnerA.id等于目标id 或者partnerB.id等于目标id
- 文档的
这样写既和你原来两次独立查询的结果完全等价,又只需要一次数据库请求,完美解决了效率问题。
内容的提问来源于stack exchange,提问作者Marius
相关产品推荐
相关产品推荐

