Puoi utilizzare un metodo di aggiornamento atomico come findOneAndUpdate()
per il tuo post dove puoi specificare il upsert
opzione. Se upsert
è true e nessun documento corrisponde ai criteri della query, findOneAndUpdate()
inserisce un unico documento. Qui è dove puoi anche usare il nativo$push
operatore per inviare la nuova domanda e le risposte all'array di domande, anziché utilizzare un ciclo quando puoi lasciare che mongo faccia tutto il lavoro sul server.
L'esempio seguente mostra come refactoring del codice:
var express = require('express');
var router = express.Router();
var Survey = require('../models/QBank');
router.post('/', function(req, res, next){
Survey.findOneAndUpdate(
{ "surveyname": req.body.sname }, /* <query> */
{ /* <update> */
"$push": {
"question": {
"que": req.body.que,
"ans1": req.body.ans1,
"ans2": req.body.ans2,
"ans3": req.body.ans3,
"ans4": req.body.ans4
}
}
},
{ "upsert": true }, /* <options> */
function(err, doc){ /* <callback> */
if(err) res.json(err);
else
req.flash('success_msg', 'Question saved to QBank');
res.redirect("/CreateSurvey");
}
);
});
module.exports = router;
In quanto sopra, i campi ei valori di entrambi <query>
e <update>
i parametri vengono creati se il <update>
contiene le espressioni dell'operatore di aggiornamento. L'aggiornamento crea un documento di base dalle clausole di uguaglianza nel <query>
parametro, quindi applica le espressioni di aggiornamento da <update>
parametro.