обновление объекта массива в mongodb с использованием драйвера Nodejs - PullRequest
0 голосов
/ 25 января 2020

Вот мой сохраненный документ

"_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"),

Вот мой мон go запрос оболочки:

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

Но , обновляется только один элемент MOREOVER этот query не работает в nodejs.

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}] всех элементов в одном go уникальном коде - это код продукта, т.е. я хочу обновить tradeCopies в vendorOrder, откуда productCode, orderId, dealerId req.body и tradeCopies должны обновляться против productCodes.

1 Ответ

0 голосов
/ 25 января 2020

Чтобы обновить все элементы (поле "tradeCopies") в массиве, соответствующее условию в поле элемента массива ("productCode"), необходимо использовать параметр обновления $arrayFilters. Это можно сделать как в Mon go Shell, так и в вызове метода API драйвера NodeJS updateOne.

Mon go Версия оболочки:

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

The NodeJS версия:

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

[Редактировать - Добавить]

При использовании синтаксиса asyn c / await запрос будет выглядеть следующим образом (подробнее см. MongoDB NodeJS примеры обновления драйверов ):

result = await coll.updateOne( { ... }, { $set: { ... } }, { arrayFilters: [ { ...} ] } );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...