Обновите пакетные документы, если они есть, вставьте в MongoDB - PullRequest
1 голос
/ 24 апреля 2020

У меня есть набор документов в массиве, который работает нормально, если я использую запрос insertMany. Теперь я хочу добавить условие в запрос. Если документ существует с таким же product_ID , обновите его. Как использовать массив документов с updateMany. Я не хочу использовать обновление по одному.

Массив документов: First time Insert

[
{_id:"5ea0428e5f725d00079afaab", product_id:345, title:"Car"},
{_id:"5e40428e5f725d00079afa4b", product_id:456, title:"Ball"},
{_id:"5e60428e5f725d00079afaab", product_id:555, title:"Dog"},
]

Ожидаемый код, подобный этому: Second time update потому что product_id уже существует.

  return db.collection("cars").updateMany([
    {_id:"5ea0428e5f725d00079afaab", product_id:345, title:"Hen"},
    {_id:"5e40428e5f725d00079afa4b", product_id:456, title:"Cow"},
    {_id:"5e60428e5f725d00079afaab", product_id:555, title:"Goat"},
    ]).then((items) => { 
    return { statusCode: 200, body: items }; })
    .catch(err => {
      console.log('=> an error occurred: ', err);
      return { statusCode: 500, body: 'error' };
    });

1 Ответ

1 голос
/ 24 апреля 2020

Вы можете .map() ваш массив в массив replaceOne операций и использовать bulkWrite для их выполнения. Обратите внимание, что вы передаете _id, который в любом случае должен быть уникальным:

var data = [
{_id:"5ea0428e5f725d00079afaab", product_id:345, title:"Car"},
{_id:"5e40428e5f725d00079afa4b", product_id:456, title:"Ball"},
{_id:"5e60428e5f725d00079afaab", product_id:555, title:"Dog"},
];

var upserts = data.map(doc => ({
    "replaceOne": {
        filter: { product_id: doc.product_id} ,
        replacement: doc,
        upsert: true
    }
}));

console.log(upserts);
db.collection.bulkWrite(upserts)
...