【问题标题】:Can't create multiple objects with MongoDB + Node无法使用 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中的数据仍然存在,我认为它会在执行服务器时更新。谢谢你!

标签: mongodb express mongoose mean-stack insomnia


【解决方案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 创建新数据。
猜你喜欢
  • 2020-03-23
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2016-06-16
  • 2017-03-07
  • 1970-01-01
  • 2011-08-15
相关资源
最近更新 更多