使用 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 = {}
希望对您有所帮助!
我的 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 = {}
希望对您有所帮助!