MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come salvare una matrice di input in uno schema figlio in uno schema mangusta nidificato?

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.