Mongoose - 如何通过另一个字段的值来增加一个字段

Posted

技术标签:

【中文标题】Mongoose - 如何通过另一个字段的值来增加一个字段【英文标题】:Mongoose - How to increment a field by value of another field 【发布时间】:2021-06-25 06:57:33 【问题描述】:

我是猫鼬 ODM 的新手。我正在尝试通过另一个字段的值来增加一个值。以下是我尝试过的:


const deletedCartItem = await Cart.findOneAndUpdate(
     sessionId: req.session.sessionId, "productInfo.productId": product_id ,
    
      $inc: 
        checkoutAmount: "$productInfo.totalAmount"//totalAmount is a nested field here.
      ,
      $pull: 
        productInfo:  productId: product_id ,
      ,
    ,
     new: true, useFindAndModify: false 
  );


我的收藏架构如下所示:


const cartSchema = mongoose.Schema(
  sessionId: 
    type: String,
    unique: true,
  ,

  checkoutAmount: 
    type: Number,
  ,

  orderStatus: 
      type: String,
      default: "INCART"
  ,

  productInfo: [
    
      productId: 
        type: String,
        required: true,
        unique: true,
      ,
      quantity: 
        type: Number,
        required: true,
      ,
      price: 
        type: Number,
      ,
      totalAmount: 
        type: Number,
      
    
  ],
);

我得到的错误是 -

我在这里遗漏了什么吗? 提前致谢!

【问题讨论】:

您认为提供的答案中是否有某些内容无法解决您的问题?如果是这样,请对答案发表评论,以澄清究竟需要解决哪些尚未解决的问题。如果它确实回答了您提出的问题,请注意Accept your Answers您提出的问题 【参考方案1】:

更新不允许将内部字段的值用于其他字段,您必须从 MongoDB 4.2 开始使用 update with aggregation pipeline,

$reduce 迭代 productInfo 的外观并检查条件是否 productId 匹配然后返回其 totalAmount$add 增加 checkoutAmount 与从上面返回的 totalAmount $reduce 操作 $filter 迭代productInfo 的循环并过滤不匹配productId 的元素
const deletedCartItem = await Cart.findOneAndUpdate(
   sessionId: req.session.sessionId, "productInfo.productId": product_id ,
  [
    $set: 
      checkoutAmount: 
        $add: [
          "$checkoutAmount",
          
            $reduce: 
              input: "$productInfo",
              initialValue: 0,
              in: 
                $cond: [
                   $eq: ["$$this.productId", product_id] ,
                  "$$this.totalAmount",
                  "$$value"
                ]
              
            
          
        ]
      ,
      productInfo: 
        $filter: 
          input: "$productInfo",
          cond:  $ne: ["$$this.productId", product_id] 
        
      
    
  ],
   new: true, useFindAndModify: false 
);

Playground

【讨论】:

以上是关于Mongoose - 如何通过另一个字段的值来增加一个字段的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose:如何使用来自模式的数据(产品值)使用方法填充另一个模式()中的字段?

MYSQL如何根据变量的值来选择字段进行查询

如何在 Mongoose 中使用 MixedId 字段和另一个字段作为 ObjectId 的连接

通过比较两个输入字段中的值来启用/禁用元素

Vue.js:通过循环遍历数组值来绑定文本字段的值

如何在另一个外部类变量中分配进度条的值来执行计算?