Mongoose查询collection时指定仅返回_id字段未生效
问题根因
调用connection.db.collection()拿到的是MongoDB Node.js原生驱动的集合实例,而非Mongoose Model封装的查询对象,其find方法语法和旧版Mongo Shell的find签名不兼容:
- 旧版Mongo Shell的
find方法签名为find(query, projection),第二个参数直接接收投影配置文档,直接传{ _id: 1 }可以正常生效 - Node.js MongoDB驱动v3及以上版本中,
find方法的第二个参数是全局配置对象,投影规则需要挂载在配置对象的projection字段下。直接传入{ _id: 1 }会被驱动识别为无效配置直接忽略,因此会返回匹配文档的全部字段。
修复方案
以下两种写法均可实现仅返回_id字段的需求:
- 方式1:在find的配置项中明确声明projection字段
await connection.db.collection("collectionName").find( { updatedAt: { $gt: lastUpdated } }, { projection: { _id: 1 } } ).toArray();
- 方式2:链式调用
project方法传入投影规则,语义更清晰,不易和其他配置项混淆
await connection.db.collection("collectionName") .find({ updatedAt: { $gt: lastUpdated } }) .project({ _id: 1 }) .toArray();
注意:通过
connection.db.collection()获取原生集合实例后,所有查询操作完全遵循Node.js MongoDB驱动的语法规则,不会触发Mongoose内置的Schema转换、字段过滤等封装逻辑,不可直接照搬Mongo Shell的简写写法。
内容的提问来源于stack exchange,提问作者drake1994
相关产品推荐
相关产品推荐

