如何获取MongoDB集合总数据量?代码报错res.find is not a function
问题分析与解决
错误原因
你这段代码报错res.find is not a function有两个核心问题:
- 变量名冲突:外层的
res是HTTP响应对象,而count回调里又用了res作为参数,这里的res其实是MongoDB返回的集合总数量(数字类型),根本没有find方法。 - 逻辑错误:
count方法本身就是用来获取集合数据总量的,回调返回的第二个参数就是最终计数,不需要再调用find()。
修正后的代码(回调风格)
getTotalCount = (req, res) => { let params = req.body; console.log('params#####', params.query); return new Promise((resolve, reject) => { MongoClient.connect(mongoDbUrl, (err, client) => { if (err) { console.log('MongoDB连接失败:', err); return reject(err); } const dbo = client.db(dbName); // 把回调参数改成totalCount,避免和外层res冲突 dbo.collection('error_logs').count({}, (err, totalCount) => { client.close(); // 用完数据库连接要关闭 if (err) { console.log('获取计数失败:', err); return reject(err); } resolve(totalCount); // 给前端返回结果 res.send({ status: 'success', data: totalCount }); }); }); }); }
更推荐的Async/Await写法(简洁易维护)
getTotalCount = async (req, res) => { let params = req.body; console.log('params#####', params.query); try { const client = await MongoClient.connect(mongoDbUrl); const dbo = client.db(dbName); // countDocuments是MongoDB 3.4+推荐的方法,count已被标记为废弃 const totalCount = await dbo.collection('error_logs').countDocuments({}); client.close(); res.send({ status: 'success', data: totalCount }); return totalCount; } catch (e) { console.log('获取日志总数失败:', e); res.send({ status: 'fail', data: e.message }); throw e; } }
额外注意点
- 从MongoDB 3.4版本开始,
count()方法已被废弃,官方推荐使用countDocuments()(统计所有匹配文档)或estimatedDocumentCount()(快速估算总数,不扫描全集合)。 - 数据库连接用完后记得调用
client.close()释放资源,或者考虑使用连接池来复用连接,提升性能。
内容的提问来源于stack exchange,提问作者Mukesh Majoka
相关产品推荐
相关产品推荐

