使用 Mongoose 创建方法时,文档被两次插入 MongoDB

Document is inserted twice into MongoDB when using Mongoose create method

我的 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 并使用创建方法将其添加到 MongoDB 中的购物车集合。

{ "username":"admin", "productsInCart": [ { "productId":1, "productName":"Watch", "quantity":4 }, { "productId":2, "productName":"Phone", "quantity":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": "Open", "productsInCart": [], "createdAt": "2021-01-04T15:25:35.188Z", "updatedAt": "2021-01-04T15:25:35.188Z", "cartId": 13, "__v": 0 }, { "statusOfCart": "Open", "productsInCart": [ { "_id": "5ff332a891aa170b60a21ea9", "productId": 1, "productName": "Watch", "quantity": 4 }, { "_id": "5ff332a891aa170b60a21eaa", "productId": 2, "productName": "Phone", "quantity": 5 } ], "username": "admin", "createdAt": "2021-01-04T15:25:35.210Z", "updatedAt": "2021-01-04T15:25:35.210Z", "cartId": 14, "__v": 0 }

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

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

你可以简单地这样做:

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} 标志。它用于 return 在 findOneAndUpdate 方法中更新文档。但是在create/save中,mongoose默认是return的数据。因此标志不是 needed.If 你省略了标志,可以防止重复条目。

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

let ctMod = new cartModel();

可以只是

let ctMod = {}

希望对您有所帮助!