Node.js连接运行中的MongoDB查询数据返回空数组问题
Mongoose查询MongoDB返回空数组的排查与解决方法
问题描述
在Node.js中使用Express和Mongoose连接本地运行的MongoDB的test数据库,尝试查询docker集合的数据,但控制台始终返回空数组,MongoDB服务已确认正常运行。
代码与运行输出
代码
import express from 'express' import child_process, {execSync} from 'child_process' import mongoose from 'mongoose'; const app = express(); const connectDB = async() => { mongoose.connect('mongodb://localhost:27017/test') const dockSchema = new mongoose.Schema({ image: String, run: String, close: String }) const dock = mongoose.model('docker', dockSchema) const data = await dock.find(); console.warn(data) console.log("connection done") } connectDB(); app.get("/", (_req,res)=>{ res.send("hello from satyam") }) app.listen(8000,()=>console.log("use local host at port 8000"))
运行输出
use local host at port 8000 [] connection done
排查与解决方法
集合名称不匹配:Mongoose默认会将模型名转换为小写复数形式,所以你定义的
docker模型会对应MongoDB中的dockers集合,而非docker集合。如果你的目标集合确实是docker,需要在创建模型时显式指定集合名称:const dock = mongoose.model('docker', dockSchema, 'docker')未等待数据库连接成功:当前代码中
mongoose.connect没有使用await,可能导致查询操作在数据库连接建立前执行,自然返回空数组。修改连接代码,确保连接成功后再执行查询:await mongoose.connect('mongodb://localhost:27017/test')集合中无数据:直接通过MongoDB Shell验证集合是否存在数据,执行以下命令:
# 进入MongoDB Shell mongosh # 切换到test数据库 use test # 查询docker集合数据 db.docker.find() # 或者查询dockers集合(如果Mongoose自动创建了复数集合) db.dockers.find()如果查询结果为空,说明集合本身没有数据,需要先插入数据再执行代码查询。
Schema字段与集合字段不匹配:Mongoose会严格按照Schema定义映射字段,如果集合中的字段名大小写、拼写和Schema不一致,会导致数据无法被正确读取。比如集合中字段是
Image而Schema中是image,就会出现映射失败,返回空数组。需要确保Schema字段和集合中的字段完全一致。数据库权限问题:检查当前连接MongoDB的用户是否拥有
test数据库docker集合的读取权限。如果开启了认证,需要在连接字符串中指定用户名和密码,例如:mongoose.connect('mongodb://username:password@localhost:27017/test?authSource=admin')若暂时测试,可以关闭MongoDB的认证模式,确认是否是权限导致的问题。
内容的提问来源于stack exchange,提问作者Summer
相关产品推荐
相关产品推荐

