首页 > 解决方案 > 使用 Nodejs 驱动程序更新 mongodb 中的数组对象

问题描述

这是我保存的文档

"_id": ObjectId("5e26be38c13b7149d0a95111"),
"isApproved": false,
"vendorOrder": [ 
  {
    "_id": ObjectId("5e26be38c13b7149d0a95113"), 
    "publicationCode": "TOI", 
    "publicationName": "Times of India", 
    "editionName": "chennai city", 
    "productCode": "TCE1", 
    "subscriptionCopies": 70, 
    "tradeCopies": 40
  }, 
  {
    "_id": ObjectId("5e26be38c13b7149d0a95112"), 
    "publicationCode": "ET", 
    "publicationName": "Economic Times", 
    "editionName": "chennai city", 
    "productCode": "ECE1", 
    "subscriptionCopies": 20, 
    "tradeCopies": 100
  }
],
"frequency": "TH",
"orderCreatedBy": ObjectId("5e25550a3405363bc4bf86c1"),
"submittedTo": ObjectId("5e2555363405363bc4bf86c2"),

这是我的 mongo shell 查询:

db.orders.updateOne(
  {
    "_id": ObjectId("5e26be38c13b7149d0a95111"),
    "submittedTo":ObjectId("5e2555363405363bc4bf86c2"), 
    "vendorOrder.productCode": "TCE1"
  },
  { $set:{"vendorOrder.$.tradeCopies":80 }
})

但是,只有一个元素正在更新,而且这在nodejsquery中不起作用。

Nodejs查询:

const { orderId, dealerId, productCode, tradeCopies } = req.body;
try {
  const orders = await Order.updateOne(
    {
      _id: orderId,
      submittedTo: dealerId,
      vendorOrder.productCode: productCode
    }, { 
      $set: { vendorOrder.$.tradeCopies: tradeCopies } 
    }
  )
} catch(ex) {
  console.log(ex);
}

目标是一次性更新所有元素的vendorOrder:[{tradeCopies}]唯一代码是产品代码,即我想更新,tradeCopies将来自vendorOrder哪里并且应该根据.productCodeorderIddealerIdreq.bodytradeCopiesproductCodes

标签: node.jsmongodbmongoose

解决方案


要更新与数组元素字段(“productCode”)上的条件匹配的数组中的所有元素(“tradeCopies”字段),您必须使用$arrayFilters更新选项。这可以在 Mongo Shell 以及 NodeJS 驱动程序的 API 方法调用中完成updateOne

Mongo Shell 版本:

db.collection.updateOne(
   { _id: ObjectId("5e26be38c13b7149d0a95111"), submittedTo:ObjectId("5e2555363405363bc4bf86c2") },
   { $set: { "vendorOrder.$[elem].tradeCopies" : 80 } },
   {
     arrayFilters: [ { "elem.productCode": "TCE1" } ]
   }
)

NodeJS 版本:

col.updateOne( { _id: orderId, submittedTo: dealerId,  }, 
               { $set: { "vendorOrder.$[elem].tradeCopies" : 80 } }, 
               { arrayFilters: [ { "elem.productCode": "TCE1" } ] }, 
               function( err, result ) {
                   console.log(result);
               }
);

[编辑-添加]

使用 async / await 语法,查询将是这样的(有关详细信息,请参阅MongoDB NodeJS 驱动程序更新示例):

result = await coll.updateOne( { ... }, { $set: { ... } }, { arrayFilters: [ { ...} ] } );

推荐阅读