MongoDB查询时如何排除不存在指定排序字段的文档?
MongoDB查询过滤无指定字段文档的方案
核心解决方法
在find()方法的查询参数中添加$exists判断,仅匹配存在analytics.one_day_change字段的文档,修改后代码如下:
exports.getProductPriceByLosers = (req,res) => { // 新增查询条件:只返回存在analytics.one_day_change字段的文档 Market.find({ "analytics.one_day_change": { $exists: true } }) .sort({ "analytics.one_day_change": 1 }) .select('analytics.one_day_change name') .limit(10) .exec((err, data) => { if (err){ return res.status(400).json({ error: 'No products found' }) } res.json(data) }) }
原问题原因
MongoDB排序时,会将不存在的字段默认识别为null值,升序排序规则下null的优先级高于所有非空数值,因此没有对应字段的文档会全部排在结果集最前面,干扰正常排序结果。
可选优化
- 如果需要同时过滤掉字段值为
null的异常记录,可以扩展查询条件:Market.find({ "analytics.one_day_change": { $exists: true, $ne: null } }) - 若不需要完全排除无字段的文档,仅希望其排在排序结果末尾,可以保留原查询条件,给排序规则添加
missing: '_last'配置(MongoDB 3.2及以上版本支持),但该方案不会减少返回的无效文档数量,仅调整排序顺序,不匹配当前需求。
内容的提问来源于stack exchange,提问作者Stephanie Cherry
相关产品推荐
相关产品推荐

