无法使用 MongoDB + Node 创建多个对象

Posted

技术标签:

【中文标题】无法使用 MongoDB + Node 创建多个对象【英文标题】:Can't create multiple objects with MongoDB + Node 【发布时间】:2021-11-09 15:44:06 【问题描述】:

我正在尝试使用 mongodb、mongoose 和 express(通过使用 Insomnia)创建多个对象。我设法创建了第一个对象,但是当我尝试创建以下对象时,它给了我以下错误:


  "success": false,
  "message": 
    "driver": true,
    "name": "MongoError",
    "index": 0,
    "code": 11000
  

我试图通过在对象中包含不同的数据来解决它(尽管我没有在属性中指定唯一性),但它无论如何都会抛出 11000(重复键)错误。

req.body 的日志返回 inmovilizadoInmaterial: 12, inmovilizadoMaterial: 13 (因为注册时包含的数据就是这些值)

这是模型

const mongoose = require("mongoose");
const  Schema  = mongoose;

const balanceSchema = new Schema(
  
    inmovilizadoInmaterial:  type: Number, default: 0 ,
    inmovilizadoMaterial:  type: Number, default: 0 ,
  
);

module.exports = mongoose.model("Balance", balanceSchema);

这是连接模型和控制器对象的路由器:

const express = require('express');
const router = express.Router();

const balanceController = require('../controllers/balance.controller');

router.post('/create', balanceController.create);

module.exports = router;

最后是具有创建对象功能的控制器。


const balanceController = ;

const Balance = require('../models/Balance')

balanceController.create = async(req,res)=>
    const balance = new Balance(req.body);
    balance.save();


module.exports = balanceController;

我知道这一定是一个非常简单的错误,但我对这项技术非常陌生。

非常感谢您!

【问题讨论】:

如果您没有在任何索引上专门设置任何唯一性约束,那么唯一的默认约束是在 _id 字段上。我假设您将其发送到req.body 是的,它包含在 req.body 中。问题在于,重复键是 userId(在旧版本的数据库中,它是此处不再包含的属性)。我不知道更改架构后db中的数据仍然存在,我认为它会在执行服务器时更新。谢谢你! 【参考方案1】:

您可以尝试像这样更改您的控制器吗:

balanceController.create = async(req,res)=>
  try 
    console.log('Req body:', req.body);
    const balance = await Balance.create(req.body);
    res.status(200).json(success: true);  
   catch(error) 
    console.log('ERROR: ', error);
    res.status(400).json(success: false, error);  
  

请注意,req.body 将被记录,因此您可以检查您的控制器是否接收到正确的数据(也许您正在从前端发送空的 req.body)。 error 也将登录。如果这不起作用,请将 console.log(req.body)console.log(error) 的输出添加到您的问题中。

【讨论】:

不,同样的事情。由于存在错误(11000),它将始终输入您的代码的捕获。问题是我第二次尝试将信息注册到数据库中。从字面上看,该集合有 1 个项目。如果我删除它,它将注册新的,但同样只允许数据库中的一项。 可以,但请尝试console.log(error)。它会告诉你想要 key 重复。另外,请在您的问题中添加console.log(req.body) console.log(error) 成功了!重复的键是 userId(在旧版本的数据库中,它是一个不再包含在此处的属性)。我不知道更改架构后db中的数据仍然存在,我认为它会在执行服务器时更新。非常感谢! 不,之前的所有数据都保留了下来。只是会根据更新的 Schema Model 创建新数据。

以上是关于无法使用 MongoDB + Node 创建多个对象的主要内容,如果未能解决你的问题,请参考以下文章

Docker - Node.js + MongoDB - “错误:无法连接到 [localhost:27017]”

无法使用 Node.js Express MongoDB Mongoose CoffeeScript 发布

Node.JS、Express 和 MongoDB :: 多个集合

一个包含 node.js 和 mongodb 的整个网站?

Node.js - Mongodb - Mongoose / 无法将数组字符串传递到 $push feild

不能使用 Node js(express) 和 MongoDB(mongoose) 对用户配置文件进行审核