MongoDB如何让$or条件优先执行首个查询,无结果再执行第二个?
实现方法
可以通过MongoDB的聚合管道实现这种优先级查询,无需发起两次请求,具体方案如下:
核心思路
给匹配不同条件的文档赋予优先级分数,让符合第一个条件的文档分数更高,再通过排序+取第一条的方式,实现「优先匹配第一个条件,无结果则匹配第二个」的效果。
具体聚合查询代码
db.collection.aggregate([ // 给匹配条件的文档添加优先级分数 { $addFields: { priority: { $cond: [ { $eq: ["$keyword", "pocket hole drill bit"] }, 2, // 第一个条件匹配,设最高优先级分数 { $cond: [ { $in: ["03", "$price"] }, 1, // 第二个条件匹配,设次优先级分数 0 // 都不匹配,分数设为0 ] } ] } } }, // 过滤掉不匹配任何条件的文档 { $match: { priority: { $gt: 0 } } }, // 按优先级分数降序排序,确保高优先级文档在前 { $sort: { priority: -1 } }, // 只取第一个结果 { $limit: 1 } ])
效果验证
针对你提供的示例文档:
- 匹配
keyword条件的文档会被赋予priority:2,排在最前面,最终返回该文档; - 如果数据库中不存在匹配
keyword的文档,那么匹配price条件的文档(priority:1)会被选中返回。
这个方案通过一次聚合查询就实现了和你给出的JSfind逻辑完全一致的效果。
内容的提问来源于stack exchange,提问作者Akash Salunkhe
相关产品推荐
相关产品推荐

