【问题标题】:Document is inserted twice into MongoDB when using Mongoose create method使用 Mongoose 创建方法时,文档被两次插入 MongoDB
【发布时间】:2021-01-05 16:59:32
【问题描述】:

我的 API 中有以下架构,它获取用户名和他添加到购物车的产品的详细信息。

const mongoose = require('mongoose');

mongoose.connect('mongodb connection').then(()=>{
console.log('DB connection is successfull');});

const AutoIncrement = require('mongoose-sequence')(mongoose);

const cartSchema = new mongoose.Schema({
cartId : {
    type : Number
},
username : {
    type : String
},
productsInCart : [{
    productId : {type : Number,required : true},
    productName : {type:String},
    quantity : {type:Number}
}],
statusOfCart : {
    type : String,
    default : 'Open'
}},{ timestamps: true });

cartSchema.plugin(AutoIncrement,{id : 'cart_seq',inc_field : 'cartId'});
let cartModel = mongoose.model('carts',cartSchema);
module.exports = cartModel;

正如您在上面的代码中看到的,我还使用 mongoose-sequence 将 cartId 设为自动递增字段。

现在,我有一个 POST 请求,它在请求正文中获取以下 JSON,并使用 create 方法将其添加到 MongoDB 中的购物车集合中。

{ “用户名”:“管理员”, "productsInCart": [ { “产品ID”:1, "productName":"手表", “数量”:4 }, { “产品编号”:2, "productName":"电话", “数量”:5 } ] }

Express API 中 POST 请求的路由处理程序中的代码如下所示

let ctMod = new cartModel();
ctMod.username = req.body.username;
ctMod.productsInCart = req.body.productsInCart;
let insCartData = await cartModel.create(ctMod,{new:true});
if(insCartData.length > 0)
{
  return res.status(200).json({
       message : `New items got inserted into the cart with the ID : ${insCartData.cartId}`,
       data : insCartData
       });
 }

上面的代码将两个条目插入到集合中,而不是一个

{ "statusOfCart": "打开", "productsInCart": [], "createdAt": "2021-01-04T15:25:35.188Z", "updatedAt": "2021-01-04T15:25:35.188Z", “cartId”:13, “__v”:0 }, { "statusOfCart": "打开", “产品购物车”:[ { "_id": "5ff332a891aa170b60a21ea9", “产品ID”:1, "productName": "手表", “数量”:4 }, { "_id": "5ff332a891aa170b60a21eaa", “产品ID”:2, "productName": "电话", “数量”:5 } ], “用户名”:“管理员”, "createdAt": "2021-01-04T15:25:35.210Z", "updatedAt": "2021-01-04T15:25:35.210Z", "cartId": 14, “__v”:0 }

你能帮我理解为什么我的数据库中有重复的条目吗?

【问题讨论】:

    标签: node.js mongodb express mongoose mongoose-schema


    【解决方案1】:

    我不确定您为什么要使用 cartModel.create(ctMod,{new:true}); 来为您的收藏创建一个新条目。

    你可以这样做:

    let ctMod = new cartModel();
    ctMod.username = req.body.username;
    ctMod.productsInCart = req.body.productsInCart;
    
    try{
    let insCartData = await cartModel.save();
      return res.status(200).json({
          error:false,
           message : `New items got inserted into the cart with the ID : ${insCartData.cartId}`,
           
          data : insCartData
        
       });
     }
    catch(err){
    console.error("error inserting data", err);
    return res.status(500).json({error:true, message:"Something went wrong :("}).
    
    }
    
    

    更新:

    重复条目的原因是您在创建 API 中传递了 {new:true} 标志。它用于在findOneAndUpdate 方法中返回更新的文档。但是在创建/保存中,猫鼬默认返回数据。因此不需要该标志。如果省略该标志,可以防止重复条目。

    此外,由于您使用create 方法来保存新条目,因此您无需创建cartModel 的实例。即,

    let ctMod = new cartModel();

    可以只是

    let ctMod = {}

    希望对你有帮助!

    【讨论】:

    • 使用 save 代替 create 确实避免了重复条目...你知道为什么 create 会插入重复条目
    猜你喜欢
    • 2017-03-15
    • 2019-06-09
    • 1970-01-01
    • 2017-12-22
    • 2017-06-17
    • 2018-09-20
    • 2020-12-26
    • 2017-06-22
    • 1970-01-01
    相关资源
    最近更新 更多