sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo guardar una matriz de entradas en un esquema secundario en un esquema de mangosta anidado?

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.