You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 01:24:03