MongoDB聚合$match返回空数组但.find()正常的问题排查
问题
我正在编写代码从MongoDB中返回满足特定name且年龄大于指定值的文档,该逻辑后续将用于分页功能。我需要同时用.find()和聚合$match实现该查询,.find()能返回预期结果,但$match却返回空数组,请问问题出在哪里?
*name、lastAge和lastId均为查询参数,lastAge会被解析为整数等类型。
查询代码
const query = { name: name }; if (lastAge) { const ageQuery = {}; ageQuery[age] = {'$gt': lastAge }; if (lastId) { query.$or = [ageQuery, { _id: { '$gt': lastId } }] } else { query = { ...query, ... ageQuery } } }
Person集合文档示例
[{ "_id": "152asbasfb56", "name": "test", "company": "company1", "age":1 }, { "_id": "123gf77293ewf", "name": "test", "company": "company2", "age": 2 }, { "_id": "536gfjdbe8000", "name": "testName", "company": "company3", "age":3 }]
.find()实现
const people = await Person.find(query); //返回预期文档
聚合$match实现
const people = await Person.aggregate([ { $match: query //返回[] }]);
原因与解决方案
问题出在构建ageQuery时使用了变量age作为字段键,但你的文档中年龄字段是固定的"age"字符串,大概率变量age的值不是"age",导致查询条件里的字段名错误。而MongoDB的.find()和聚合$match对这种错误的处理逻辑有差异:
.find()会忽略不存在的字段条件,只要name条件匹配就能返回结果;- 聚合
$match会严格匹配所有条件,当字段名不存在时,没有文档能满足条件,因此返回空数组。
修正后的代码
直接指定字段名为"age",替换变量age的动态键写法:
const query = { name: name }; if (lastAge) { // 直接使用固定字段名"age"构建条件 const ageQuery = { age: {'$gt': lastAge } }; if (lastId) { query.$or = [ageQuery, { _id: { '$gt': lastId } }]; } else { query = { ...query, ...ageQuery }; } }
修改后,.find()和聚合$match都会生成正确的查询条件,返回一致的结果。
内容的提问来源于stack exchange,提问作者Jo1234
相关产品推荐
相关产品推荐

