首页 > 解决方案 > 使用nodejs更新mongodb中的多个不同数组对象元素

问题描述

mongodb集合:

 "_id": ObjectId("5e2ac528e9d99f3074f31de7"),
"publications": [ 
  {
    "_id": ObjectId("5e2ac528e9d99f3074f31de8"), 
     "name": "Times of India", 
     "productCode": "TCE1", 
     "tradeCopies": 40
  }, 
  {
    "_id": ObjectId("5e2ac528e9d99f3074f31de9"),  
    "publicationName": "Economic Times",  
    "productCode": "ECE1", 
    "tradeCopies": 100
  }
],
"orderCreatedBy": ObjectId("5e2977e1cc1208c65c00648b"),
"submittedTo": ObjectId("5e2555363405363bc4bf86c2"),

Nodejs 代码

我会得到多个“productCode”,如“TCE1”、“ECE1”等,我需要根据它们的 productCodes 一次性更新所有对象数组元素的 tradeCopies

这是我尝试过的

exports.editOrder = async (req, res, next) => {
  const { orderId, dealerId, productCode, tradeCopies } = req.body;
try{
    const orders: await Order.updateOne(
          { _id: orderId, 
    submittedTo: dealerId,
    "publications.productCode": productCode},
    {$set:{"publications.$.tradeCopies":50}}
    )
    res.status(200).json({
          orders,
          message: "order submitted"
        });
      } catch (error) {
        res.send(error);
      }
    };

关注点

1-此查询仅根据匹配的 productCode 更新 1 个数组对象元素我希望根据它们的 productCodes 一次性更新所有数组对象的所有 tradeCopies

2-上述查询仅在 mongo Shell 中有效,不在 nodejs 驱动程序中,每当我在 nodejs 查询中删除双引号时 vscode 显示可能会出现错误

标签: node.jsmongodb

解决方案


您想使用arrayFilters

const orders: await Order.updateOne(
      {  _id: orderId, 
         submittedTo: dealerId,
         "publications.productCode": productCode
      },
      { $set: { "publications.$[element].tradeCopies":50 } },
      { arrayFilters: [ { "element.productCode": productCode } ] }
)

我不确定删除双引号是什么意思,但此代码段与 nodejs 驱动程序兼容。


推荐阅读