使用Mongo/Mongoose向已有集合添加文档时为何生成test数据库?
问题描述
我在MongoDB网页控制台手动创建了名为shoppingitems的数据库,随后在Express应用中创建了products模型并完成数据库连接,shoppingitems数据库下成功生成了products集合。但当我尝试向shoppingitems.products集合添加文档时,系统却自动创建了一个名为test的新数据库,提交的文档被存入test.products集合,而非预期的shoppingitems.products。
我的代码中从未提及test数据库,附上相关代码:
index.js
//Express var express = require("express"); const app = express(); app.use(express.json()); //Mongoose const dotenv = require("dotenv"); dotenv.config(); const mongoose = require("mongoose"); mongoose .connect(process.env.MONGO_URL, { useNewUrlParser: true, useUnifiedTopology: true, }) .then(() => console.log("db connection succesfull")) .catch((err) => console.log(err)); //CORS const cors = require("cors"); app.use(cors()); //Routes const productRoute = require("./routes/products"); app.use("/", productRoute); //RUN INDEX.JS app.listen(5000, () => { console.log("backend server is running"); });
routes/products.js
var express = require("express"); var router = express.Router(); var Product = require("../models/Products"); /* GET PRODUCTS FOR HOMEPAGE */ router.get("/", async (req, res) => { try { productList = await Product.find(); res.json(productList); } catch (error) { console.log(error); } }); //POST PRODUCTS TO DATABASE router.post("/", async (request, response) => { console.log("request.body= ", request.body); const newProduct = new Product(request.body); try { const savedProduct = await newProduct.save(); response.status(201).json(savedProduct); } catch (err) { response.status(500).json(err); } }); module.exports = router;
models/Products.js
const mongoose = require("mongoose"); const ProductSchema = new mongoose.Schema({ name: { type: String }, price: { type: Number }, description: { type: String }, image: { type: String }, stripeId: { type: String }, }); module.exports = mongoose.model("Product", ProductSchema);
我是否遗漏了什么?我找不到代码中导致创建test数据库的原因,此前仅使用过一两次Mongo,希望有人能指出问题所在,我可以提供更多所需的代码或信息。
问题原因与解决方法
核心原因是你的MongoDB连接字符串(process.env.MONGO_URL)未指定目标数据库名称,Mongoose会默认使用test数据库进行操作。
解决步骤:
- 打开项目根目录的
.env文件,检查MONGO_URL的格式,确保末尾明确指定shoppingitems数据库:- 云MongoDB(如Atlas)示例:
MONGO_URL=mongodb+srv://<你的用户名>:<你的密码>@集群地址.mongodb.net/shoppingitems?retryWrites=true&w=majority - 本地MongoDB示例:
MONGO_URL=mongodb://localhost:27017/shoppingitems
- 云MongoDB(如Atlas)示例:
- 重启Express服务,让新的连接配置生效。
额外优化(可选):
Mongoose会自动将模型名复数化作为集合名,如果你想严格对应手动创建的products集合,可以修改模型定义,显式指定集合名:
修改models/Products.js的导出代码:
module.exports = mongoose.model("Product", ProductSchema, "products");
第三个参数即为指定的集合名称。
内容的提问来源于stack exchange,提问作者Eric Andre
相关产品推荐
相关产品推荐

