Как правильно обработать и обновить документы в MongoDB на NODE JS?

246
10 августа 2021, 17:40
app.post('/api/getReports', (req, res)=>{
  let data = req.body.data; // Array of objects
  let reports = [];
  let promise = new Promise((resolve, reject)=>{
      db.collection('reports').find({}).toArray((err, res)=>{
        resolve(res);  
      });
  }).then((res)=>{
      res.forEach((item, index)=>{
         if(item.name === data.name) {
             let count = item.count + data.count;
             db.collection('reports').updateOne({name: item.name}, {$set: {count: count}});
         } else {
             db.collection('reports').insertOne(data)
         }        
      });
  })   
})

Как мне проверить новые полученные данные с ранее полученными данными в коллекции и сравнить если такая запись уже существует тогда к count этой записи прибавить только data.count если такая запись не существует то добавить в коллекцию?

Answer 1

В общем случае, в виду неясности как выглядят сами reports:

app.post('/api/getReports', async (req, res) => {
        const { data } = req.body;
        const reports = db.collection('reports');
        try {
            for(let i = 0; i < data.length; i++) {
                const report = await reports.findOne({name: data[i].name});
                if(report) {
                    await reports.updateOne({"_id": report._id}, {$inc: {count: data[i].count}})
                } else {
                    await reports.insertOne(data[i]);
                }
            }
        } catch(err) {
            console.log(err)    
        }
})

В случае, если reports это массив с объектами типа {name: "ads", count: 12}:

app.post('/api/getReports', async (req, res) => {
            const { data } = req.body;
            const reports = db.collection('reports');
            try {
                for(let i = 0; i < data.length; i++) {
                    await reports.updateOne({name: data[i].name}, {$inc: {count: data[i].count}},{upsert: true})         
                }
            } catch(err) {
                console.log(err)    
            }
    })
Answer 2

Имеем коллекцию:

{name: 'apple', count: 5},
{name: 'lemon', count: 4},

db.test.updateOne({name: 'lemon'}, {$inc:{count:1}}, {upsert: true}) - этот запрос увеличит count у лимона

db.test.updateOne({name: 'cucumber'}, {$inc:{count:1}}, {upsert: true}) - этот запрос добавит в коллекцию документ

READ ALSO
Сохранение положения выбранного option в разных select

Сохранение положения выбранного option в разных select

Как сохранить выбранное положение option в select с нужным классомВ js и jQ не силён

344
scrollHeight и clientHeight равны 0 JS

scrollHeight и clientHeight равны 0 JS

Такой странный баг у меня

182
Кэширование внешних API в Angular PWA и окружение

Кэширование внешних API в Angular PWA и окружение

Можно ли при использовании @angular/pwa кэшировать внешние API (домен приложения и API не совпадает)Если да то каким образом должна выглядеть коyфигурация...

205
Ошибка 422 при работе с fetch

Ошибка 422 при работе с fetch

Не понимаю, почему вылетает ошибка 422Вот мой код для запроса:

110