Puede usar un método de actualización atómica como findOneAndUpdate()
para su publicación donde puede especificar el upsert
opción. Si upsert
es verdadero y ningún documento coincide con los criterios de consulta, findOneAndUpdate()
inserta un solo documento. Aquí es donde también puede usar el nativo$push
operador para enviar la nueva pregunta y respuestas a la matriz de preguntas, en lugar de usar un bucle cuando puede dejar que mongo haga todo el trabajo en el servidor.
El siguiente ejemplo muestra cómo puede refactorizar su código:
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;
En lo anterior, los campos y valores de <query>
y <update>
los parámetros se crean si <update>
El parámetro contiene expresiones de operador de actualización. La actualización crea un documento base a partir de las cláusulas de igualdad en el <query>
y luego aplica las expresiones de actualización de <update>
parámetro.