如何从MongoDB的find()结果取值及解决then is not a function报错
错误原因
Node.js 版本 MongoDB 驱动中,find() 方法返回的是 FindCursor 游标对象,本身不属于 Promise 实例,因此无法直接调用 .then() 方法。你之前在 find() 后追加 .count() 可以正常运行,是因为 count() 方法本身会返回 Promise 实例,所以链式调用逻辑可以正常执行。
修复方案
- 若要获取
find()匹配的所有文档结果,需要在find()调用后追加.toArray()方法,该方法会将游标转为包含所有结果的数组,且返回 Promise 实例,可正常调用.then()接收结果。 - 新版本 MongoDB Node 驱动的字段投影规则不再直接作为
find方法的第二个参数,需要放到projection属性下,避免投影规则不生效的问题。
修改后的可运行代码如下:
function GetCollectionAllowance(clientNames) { // 从数据库获取各集合的allowance字段 MongoClient.connect('x', function (err, client) { if (err) throw err // 指定操作的数据库 var db = client.db('client-time') clientNames.forEach((element) => { // 调整投影参数写法 + 调用toArray返回Promise db.collection(element).find( {}, { projection: { allowance: 1 } } ) .toArray() .then(function(allowanceDocs) { // allowanceDocs 是所有查询到的包含allowance字段的文档数组 console.log(allowanceDocs); // 单独提取所有allowance值的写法 const allowanceValues = allowanceDocs.map(doc => doc.allowance) console.log(allowanceValues) }) }) }) }
如果你只需要获取单条匹配结果,也可以直接使用 findOne() 方法,该方法直接返回 Promise,无需调用 toArray():
db.collection(element).findOne( {}, { projection: { allowance: 1 } } ) .then(function(doc) { console.log(doc.allowance) })
内容的提问来源于stack exchange,提问作者Tom Hanks
相关产品推荐
相关产品推荐

