MongoDB find方法控制台查询正常但代码中无法返回预期结果
问题描述
- 在MongoDB控制台执行
db.Property.find({ customerCpf: 目标cpf值 })可正常查询到3条匹配文档 - 业务代码中执行相同过滤条件的
find查询无法得到预期结果,同场景下findOne方法可正常工作 - 代码运行后控制台输出体积较大的内部对象,而非预期的匹配文档数据
控制台查询操作参考:
关联代码
- 接口路由代码
app.get("/api/customer/:cpf", async (req, res) => { const properties = await Customer.consult(req); console.log(properties); res.status(200); res.end(); });
- 封装的查询方法代码
static async consult(req) { const conn = await client.connect(); const db = conn.db("website"); const cpf = req.params.cpf.toString(); console.log(cpf); const properties = await db.collection("Property").find({ customerCpf: cpf, }); return properties; }
问题原因
MongoDB Node.js驱动中,find()方法不会直接返回匹配的文档集合,而是返回*Cursor(游标)*实例,你打印出的大体积对象就是游标实例,它内置了结果遍历、分页、排序等操作的内部属性和方法,并非最终的文档数据。findOne()方法内部会自动消费游标、返回第一条匹配文档,因此可以直接拿到预期结果。
修复方案
- 对
find()返回的游标调用toArray()方法,即可将所有匹配文档转为数组返回,修改后的查询方法如下:
static async consult(req) { const conn = await client.connect(); const db = conn.db("website"); const cpf = req.params.cpf.toString(); console.log(cpf); // 调用toArray()消费游标,获取文档数组 const properties = await db.collection("Property").find({ customerCpf: cpf, }).toArray(); return properties; }
- 现有路由代码仅返回了200状态码,未将查询结果写入响应,补充响应逻辑后接口才能正常返回数据,修改后的路由代码如下:
app.get("/api/customer/:cpf", async (req, res) => { const properties = await Customer.consult(req); console.log(properties); res.status(200).json(properties); });
内容的提问来源于stack exchange,提问作者Matheus Fontana
相关产品推荐
相关产品推荐

