【问题标题】:Mongoose - How to increment a field by value of another fieldMongoose - 如何通过另一个字段的值来增加一个字段
【发布时间】: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您提出的问题

标签: mongodb mongoose


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 2018-04-19
    • 2021-08-01
    相关资源
    最近更新 更多