带默认参数匹配规则的MongoDB find()查询实现问题
实现方案
你需要的按优先级匹配的逻辑(同zip下优先匹配指定service,无匹配则取同zip的service=default条目,均无匹配则返回空)无法通过基础find()实现,需使用聚合查询完成,具体逻辑和代码如下:
查询逻辑
- 先筛选出所有
zip等于目标值,且service为「目标service」或default的文档,缩小检索范围 - 给筛选后的文档设置排序权重:精确匹配目标
service的权重为2,匹配default的权重为1 - 按权重降序排序,精确匹配的结果会排在最前
- 取排序后的第一条结果,即为符合要求的返回值
代码示例(以查询zip=94583、service="CPS"为例)
db.collection.aggregate([ { $match: { zip: "94583", $or: [ { service: "CPS" }, { service: "default" } ] } }, { $addFields: { sortWeight: { $cond: { if: { $eq: [ "$service", "CPS" ] }, then: 2, else: 1 } } } }, { $sort: { sortWeight: -1 } }, { $limit: 1 }, { $unset: "sortWeight" } // 可选:移除临时生成的权重字段 ])
规则匹配验证
- 当查询
zip=94583、service="CPS"时,精确匹配的文档权重更高,会优先返回对应结果,符合要求1 - 当查询
zip=94583、service="other"时,无精确匹配结果,会返回同zip的default条目,符合要求2 - 当查询
zip=92021、service="ABC"时,同zip下仅存在default条目,直接返回对应结果,符合要求3 - 当查询
zip=02135、service="CDF"时,第一步筛选无匹配文档,直接返回空,符合要求4 - 当查询
zip=12345、service="BCD"时,同zip下既无对应service的文档也无default条目,筛选无结果返回空,符合要求5
内容的提问来源于stack exchange,提问作者Alex Yershov
相关产品推荐
相关产品推荐

