MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment enregistrer un tableau d'entrées dans un schéma enfant dans un schéma de mangouste imbriqué ?

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.