当前位置: 首页 > 知识库问答 >
问题:

Mongoose使用子文档值更新子文档数组

姚胡媚
2023-03-14

我有一份这样的文件:

{
 _id:ObjectId('111'),
 products:[
  {
   _id:ObjectId('aaa'),
   quantity:2,
   price:800
  }
 ]
}

我想通过将其与数量字段(2*800)相乘来更新价格字段,其中的结果将更新/分配给价格。(对于本例,价格更新为1600)。

更新后的文档:

{
 _id:ObjectId('111'),
 products:[
  {
   _id:ObjectId('aaa'),
   quantity:2,
   price:1600  //the updated field by multiplying the initial 800 * 2
  }
 ]
}

我的选择查询如下:

    Shop.findOneAndUpdate(
        { "_id": '111, "products._id": 'aaa' }
    )

我怎样才能做到这一点?

共有2个答案

能可人
2023-03-14

正如@Casey在评论中建议的那样,您可以多步完成此操作,找到商店,找到产品,更改产品价格,保存商店。

router.patch("/shops/:shopId/:productId", async (req, res) => {
  const { shopId, productId } = req.params;

  let shop = await Shop.findById(shopId);

  if (!shop) return res.status(400).send("Shop not found");

  const productIndex = shop.products.findIndex((p) => p._id.toString() === productId);

  if (productIndex < 0) return res.status(400).send("Product not found in shop");

  let product = shop.products[productIndex];

  product.price *= product.quantity;

  shop = await shop.save();

  res.send(shop);
});

假设您现有的这家商店有两种产品:

{
    "_id": "5eb85ab17c2bfb3e2cfc15d0",
    "products": [
        {
            "_id": "5eb85ab17c2bfb3e2cfc15d2",
            "quantity": 2,
            "price": 800
        },
        {
            "_id": "5eb85ab17c2bfb3e2cfc15d1",
            "quantity": 3,
            "price": 500
        }
    ]
}

如果您想用“\u id”:“5eb85ab17c2bfb3e2cfc15d2”更新价格,我们会向url发送补丁请求http://your基本url/店铺/5eb85ab17c2bfb3e2cfc15d0/5eb85ab17c2bfb3e2cfc15d2

输出将如下所示:

{
    "_id": "5eb85ab17c2bfb3e2cfc15d0",
    "products": [
        {
            "_id": "5eb85ab17c2bfb3e2cfc15d2",
            "quantity": 2,
            "price": 1600  => UPDATED
        },
        {
            "_id": "5eb85ab17c2bfb3e2cfc15d1",
            "quantity": 3,
            "price": 500
        }
    ]
}
况庆
2023-03-14

在MongoDB版本上

Shop.update(
  /** Remember to convert input strings to type `ObjectId()` prior to querying */
  { _id: ObjectId("111"), "products._id": ObjectId("aaa") },
  /** This aggregation pipeline will re-create `products` array,
   *  if condition is met for an object then price will be multiplied & price field is merged to original object & pushed back to `products` array, 
   *  if condition is not met actual object is pushed back to array */
  [
    {
      $set: {
        products: {
          $map: {
            input: "$products",
            in: {
              $cond: [
                { $eq: ["$$this._id", ObjectId("aaa")] },
                {
                  $mergeObjects: [ "$$this", { price: { $multiply: ["$$this.quantity", "$$this.price"] }}]
                },
                "$$this"
              ]
            }
          }
        }
      }
    }
  ]
);
 类似资料:
  • 我试图更新一个子文档(有效),然后更新除上一个子文档之外的多个子文档。基本上,每次

  • 问题内容: 使用Mongoose可以一次性在一个(子)文档上设置多个属性吗?我正在尝试做的一个例子: 假设我有以下架构: 然后我想做: 通常,我可以使用运算符来实现此目的,但是我的问题是在此示例中是的子文档(嵌入式架构)。所以当我尝试去做 它替换了由标识的子文档实例。目前,我已经通过手动设置仅字段来“解决”它,但是我希望有一种更好的方法来做到这一点。 问题答案: 基于的字段以编程方式构建对象,以使

  • 我想使用mongoose从多个文档更新多个子文档。 我目前的代码是: 模式的一部分是: 但是这段代码只更新id arr中的最后一个元素。

  • 问题内容: 我正在使用MongoDB数据库,该数据库的收集模型包括 班级 , 学生 , 学科 和[学术] 表现 。以下是基于猫鼬的架构和模型: 该集合的文件是最复杂的地段; 示例文档为: 我能够使用以下代码检索现有的班级文档并将其添加到分数中: 但是,如何添加/更新/删除该特定学生的成绩?我需要能够通过以下方式与集合进行交互: 检索所有学生或特定学生的分数(检索数组中的特定元素) 为特定主题添加/

  • 我有一份这样的文件 上面的文档可以这样概括如下,便于理解。 我需要增加nums子文档中数量的值,该值位于产品子文档中,基于其\u id。 这是我迄今为止所尝试的,但它不起作用,因为我不知道如何捕获nums对象内的\u id,以便更新子子文档数组中的特定对象。 我怎样才能做到这一点?

  • 将mongodb与pymongo一起使用,我有以下文档: 我想更新示例子文档(这是一个数组元素,因为可能有多个示例)。我有以下代码,但它不工作... 谁能告诉我这个有什么问题吗?