Vous pouvez utiliser une méthode de mise à jour atomique telle que findOneAndUpdate()
pour votre message où vous pouvez spécifier le upsert
option. Si upsert
est vrai et aucun document ne correspond aux critères de requête, findOneAndUpdate()
insère un seul document. Ici, vous pouvez également utiliser le code natif$push
opérateur pour pousser la nouvelle question et les réponses vers le tableau de questions, plutôt que d'utiliser une boucle lorsque vous pouvez laisser mongo faire tout le travail sur le serveur.
L'exemple suivant montre comment vous pouvez refactoriser votre code :
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;
Dans ce qui précède, les champs et les valeurs de <query>
et <update>
les paramètres sont créés si le <update>
Le paramètre contient des expressions d'opérateur de mise à jour. La mise à jour crée un document de base à partir des clauses d'égalité dans le <query>
paramètre, puis applique les expressions de mise à jour à partir du <update>
paramètre.