首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Mongoose创建方法时,文档将两次插入到MongoDB中

使用Mongoose创建方法时,文档将两次插入到MongoDB中
EN

Stack Overflow用户
提问于 2021-01-04 15:46:07
回答 1查看 596关注 0票数 0

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

代码语言:javascript
复制
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;

正如您在上面的代码中所看到的那样,我也在使用猫鼬序列将cartId作为一个自动递增的字段。

现在,我有一个POST请求,它在请求体中获取下面的JSON,并使用create方法将它添加到MongoDB中的cart集合中。

{“用户名”:"productsInCart":{ "productId":1,“productName”:“观察”,“数量”:4 },{ "productId":2,“productName”:“电话”,“数量”:5}}

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

代码语言:javascript
复制
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":“5ff332a891a170b60a21ea9”,"productId":1,"productName":"Watch",“数量”:4 },{ "_id":“5ff332a891a170b60a21eaa”、"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}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-04 18:49:20

我不知道为什么要使用cartModel.create(ctMod,{new:true});来为集合创建一个新条目。

你可以这样做:

代码语言:javascript
复制
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 :("}).

}

更新:

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

此外,在使用create方法保存新条目时,不需要创建cartModel的实例。呃,

let ctMod = new cartModel();

可能只是

let ctMod = {}

希望能帮上忙!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65565501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档