首页 > 解决方案 > Mongoose 无法更新而是创建一个新数组

问题描述

即使没有遇到任何错误,我也无法更新我的收藏。有人可以帮忙吗?请我现在解决这个问题大约 3 个小时。

const product_id = req.body.cartItems.product_id;
      const item = cart.cartItems.find(c => c.product_id == product_id);
      if (item) {
        Cart.findOneAndUpdate({ "user": req.user._id, "cartItems.product_id" : product_id }, {
            "$set": {
              "cartItems.$":{
                ...req.body.cartItems.quantity,
                quantity: item.quantity + req.body.cartItems.quantity
              }
            }
          })
          .exec((error, _cart) => {
          if (error) return res.status(400).json({ error });
          if (_cart) {
            return res.status(201).json({ _cart });
          }
        });

该模型:

const mongoose = require('mongoose');

const cartSchema = new mongoose.Schema({
    user: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true},
    cartItems: [
        {
            product_id: { type: mongoose.Schema.Types.ObjectId, ref: 'Product', required: true}, // This foreign key to product _id
            quantity: {type: Number,required: true},
            price: {type: Number, required: true}
        }
    ]
}, {timestamps: true});

module.exports = mongoose.model('Cart', cartSchema);

标签: javascriptnode.jsexpressmongoose

解决方案


您需要使用 $[] 运算符来更新与您的过滤条件匹配的 cartItems 数组中的所有文档。此运算符的作用类似于数组中所有项目的占位符。考虑到您的编码,它将是这样的:

Cart.findOneAndUpdate({ "user": req.user._id, "cartItems.product_id" : product_id }, {
        "$set": {
          "cartItems.$[].quantity": item.quantity + req.body.cartItems.quantity
        }
      }).exec(...)

推荐阅读