UpdateMany in MongoDB in esecuzione due volte con $ inc
Grazie all'aiuto ricevuto nella mia domanda precedente ( UpdateMany mongodb documents with value from document ), ho imparato a incrementare utilizzando updateMany. Ho scritto il seguente codice:
ageAllCameraPriorities = async (req, res) => {
await Camera.updateMany({ enabled: true }, { $inc: { processingPriority: 1 } }, (err, dbResp) => {
if (err) {
return res.status(400).json({ success: false, error: "Status 400, unable to age camera priorities" + err })
}
if (!dbResp.n) {
return res
.status(404)
.json({ success: false, error: `No enabled cameras found to age` })
}
return res.status(200).json({ success: true, data: dbResp })
})
.catch(err => console.log(err))
}
L'intenzione di questo codice è eseguire un database mongoDB simile a questo:
[{
_id: 'ad07f',
enabled: true,
priority: 1,
more: "more data"
},{
_id: '9da0f',
enabled: false,
priority: 6,
more: "more data"
},{
_id: '35fas',
enabled: true,
priority: 3,
more: "more data"
},{
_id: '5f3ax',
enabled: true,
priority: 11,
more: "more data"
}]
... e aumenta di 1 il campo "priorità" di ogni documento abilitato.
Il codice precedente, tuttavia, aumenta il valore di 2.
Inoltre, se cambio $inc: { priority: 3 }
il valore aumenta di 6. Mi sembra che qualcosa stia probabilmente funzionando due volte. Ma sto raggiungendo l'endpoint direttamente con Postman e il codice sopra è la totalità della mia funzione. Da dove viene il secondo incremento?
EDIT:
È chiaro che la seconda esecuzione si verifica durante questa riga: return res.status(200).json({ success: true, data: dbResp })
perché posso estrarre tutto tranne quella riga e aumenterà di 2. Se rimuovo quella riga, aumenterà solo di 1. (ma l'endpoint API non ritorna mai qualsiasi cosa ... quindi non va bene)
Risposte
In base ai commenti sulla domanda originale, sono stato in grado di risolvere il problema rimuovendo .catch
e await
.
ageAllCameraPriorities = async (req, res) => {
Camera.updateMany( { enabled: true },
{ $inc: { processingPriority: req.params.amount } },
{},
(err, dbResp) => {
if (err) {
return res
.status(400)
.json({ success: false, error: "Status 400, unable to age camera priorities" + err })
}
if (!dbResp.n) {
return res
.status(404)
.json({ success: false, error:'No enabled cameras found to age' })
}
return res
.status(200)
.json({ success: true, data: dbResp })
})
}
Ero solo curioso di sapere se fosse meglio.
ageAllCameraPriorities = async (req, res) => {
await Camera.updateMany(
{ enabled: true },
{ $inc: { processingPriority: 1 } }
).then((dbResp) => {
if (!dbResp.n) {
return res
.status(404)
.json({ success: false, error: `No enabled cameras found to age` })
}
return res.status(200).json({ success: true, data: dbResp })
}).catch(err =>
console.log(err);
return res.status(400).json({ success: false, error: "Status 400, unable to age camera priorities" + err });)
}