Mongo NodeJS中findOne后调用project()报错及投影位置疑问
解决MongoDB findOne()后调用project()报错的问题
为什么会报错?
在你使用的MongoDB Node.js驱动v3.4.1版本中,findOne()方法直接返回的是一个Promise(会解析为单个文档或null),而不是游标对象。.project()是游标专属方法,只能在find()返回的游标上调用,所以链式调用.project()会抛出is not a function的错误。
正确的写法
你需要把投影参数作为第二个参数传递给findOne(),语法是findOne(query, options),其中options里的projection字段用来指定要排除或包含的属性:
function findUser(dbClient, userId) { return dbClient.db() .collection("users") .findOne( { "_id": userId }, { projection: { auth: 0, prefs: 0, consent: 0 } } ) .then(doc => doc); }
关于投影的执行位置
MongoDB的投影操作是在服务端执行的。数据库会根据你指定的投影规则筛选字段,只返回符合要求的数据,而不是把整个文档传输到客户端后再过滤。这样能减少网络传输的数据量,提升查询性能。
关于project()写法的困惑
.project()是游标对象的方法,只有当你使用find()(返回游标,用于获取多个文档)时,才可以链式调用它。比如:
// 用find()查询多个文档时,可链式调用project() dbClient.db().collection("users") .find({ "role": "user" }) .project({ auth: 0, prefs: 0, consent: 0 }) .toArray() .then(docs => { // 处理返回的文档数组 });
而findOne()是专门用来获取单个文档的方法,它直接返回Promise,不支持游标方法的链式调用,所以必须通过options参数来指定投影。
内容的提问来源于stack exchange,提问作者Leos Literak
相关产品推荐
相关产品推荐

