Nodejs中如何动态创建MongoSchema?重启服务器后集合清空是什么原因?
问题根因及对应解决方案
1. 集合创建时机问题
Mongoose 的模型定义完成后,不会主动在 MongoDB 中创建对应的物理集合,只有当你第一次通过该模型执行写入操作(新增、插入文档)时,才会触发集合创建。
如果你仅定义了account模型但从未写入过数据,重启服务后 Mongoose 没有已映射的集合实例,自然会返回空列表。
验证方法:调用一次写入操作后再查询集合列表,示例代码:
// 先执行一次写入 await accountModel.create({Id: 'test', Name: '测试数据'}) // 再查询集合列表就能看到 account 集合 const collections = Object.keys(mongoose.connection.collections);
2. 集合列表获取时机错误
你获取mongoose.connection.collections的操作,大概率是在 Mongoose 和 MongoDB 的连接完全建立成功之前执行的。此时 Mongoose 还没有同步 MongoDB 中已有的集合信息,所以拿到的是空数组。
解决方法:将集合查询逻辑放在连接成功的回调中执行,示例代码:
mongoose.connection.on('connected', async () => { const collections = Object.keys(mongoose.connection.collections); return res.status(200).json({status:true,msg:collections}) })
3. 连接了内存型 MongoDB 实例
如果你在开发/测试环境使用了mongodb-memory-server这类内存运行的 MongoDB 模拟工具,所有数据都会存在进程内存中,服务器重启相当于进程重启,所有数据和集合会被全部清空,自然查询不到集合列表。
解决方法:确认连接的 MongoDB 地址是本地/远程持久化部署的 MongoDB 服务,而非内存模拟服务,检查连接字符串是否配置正确:
// 正确的持久化MongoDB连接字符串示例 mongoose.connect('mongodb://localhost:27017/你的数据库名')
内容的提问来源于stack exchange,提问作者Bhaskar Jha
相关产品推荐
相关产品推荐

