猫鼬更新数组并添加新元素

Posted

技术标签:

【中文标题】猫鼬更新数组并添加新元素【英文标题】:mongoose update array and add new element 【发布时间】:2018-08-11 14:41:04 【问题描述】:

我很确定这个问题被问了很多项,但是我找不到我的特定问题的答案,这看起来很正常,但我似乎无法让它发挥作用。我有一个嵌入了购物车模式数组的用户模型。我正在尝试将一个对象添加到数组中,如果它存在只更新数量和价格,如果它不添加到数组中。我的代码发生的情况是,当数组为空时它会添加一个新项目,它会更新项目的数量和价格,但它不想添加新项目。我读了一点,据我所知,我不能在一个请求中使用两种不同的数据库方法。我将不胜感激,这是我第一次真正使用猫鼬。

const CartItem = require('../models/cartModel');
const User = require('../models/userModel');

exports.addToCart = (req, res) => 
  const cartItem = new CartItem.model(req.body);
  const user = new User.model();
    User.model
      .findById(req.params.id)
      .exec((err, docs) => 
        if (err) res.sendStatus(404);
        let cart = docs.cart;
        if (cart.length == 0) 
          docs.cart.push(cartItem);
        
        let cart = docs.cart;
        let isInCart = cart.filter((item) => 
          console.log(item._id, req.body._id);
          if (item._id == req.body._id) 
            item.quantity += req.body.quantity;
            item.price += req.body.price;
            return true;
          
        );
        if (isInCart) 
          console.log(cart.length)
         else 
          cart.push(cartItem);
          console.log(false);
        

        docs.save(function (err, docs) 
          if (err) return (err);
          res.json(docs);
        );
    );
 ;

我实际上设法让它像这样工作

exports.addToCart = (req, res) => 
  const cartItem = new Cart.model(req.body);
  const user = new User.model();
    User.model
      .findById(req.params.id)
      .exec((err, docs) => 
        if (err) res.sendStatus(404);
        let cart = docs.cart;
        let isInCart = cart.some((item) => 
          console.log(item._id, req.body._id);
          if (item._id == req.body._id) 
            item.quantity += req.body.quantity;
            item.price += req.body.price;
            return true;
          
        );

        if (!isInCart) 
          console.log(cart.length)
          cart.push(cartItem);
        
        if (cart.length == 0) 
          cart.push(cartItem);
        

        docs.save(function (err, docs) 
          if (err) return (err);
          res.json(docs);
        );
    );
;

不知道这是否是正确的做法,但我既可以将新产品添加到我的数组中,也可以更新现有产品的值

【问题讨论】:

您已经注意到这是不可能的。你必须做两个查询。请查看链接的副本。 MongoDB: upsert sub-document的可能重复 我认为这是个问题。但是,为什么可以在数组为空时添加一个新元素,然后在已将其推入数组时更新一个值?这不是两种不同的方法吗? 所以无论数组是否为空,问题都是一样的。您只能运行一个查询,即更新数组或在任何时候向数组添加元素。本质上,数组没有 upsert 类型的功能可以在一个更新查询中处理这个问题。 【参考方案1】:

也许您的问题有一个更简单的解决方案:在mongoose documentation 上查看此页面:某些版本的 mongoDB 和 mongoose 存在兼容性问题,也许您需要将模型代码编辑为如下所示:

const mongoose = require("mongoose");

const CartSchema = new mongoose.Schema(
  //your code here
,  usePushEach: true );

module.exports = mongoose.model("Cart", CartSchema);

您可以在这里找到更多信息:https://github.com/Automattic/mongoose/issues/5924

希望对你有帮助。

【讨论】:

谢谢,我确实让它工作了。我用我使用的代码编辑了我的帖子,如果它是在猫鼬中做事的正确方法,请不要这样做,但是嘿它有效:D

以上是关于猫鼬更新数组并添加新元素的主要内容,如果未能解决你的问题,请参考以下文章

javascript js求和2个数组并返回一个新数组

猫鼬:更新字段,将对象推送到数组中[重复]

拆分两个元素的元组并添加到熊猫数据框[重复]

如何更新具有嵌入文档的猫鼬数组中的许多元素

猫鼬更新对象数组中匹配条件的元素的值

如何使用猫鼬更新子文档数组中的特定元素? [复制]