¿Cómo guardar una matriz de entradas en un esquema secundario en un esquema de mongoose nested?

Estoy tratando de guardar una encuesta que contiene preguntas múltiples. Cada vez que escribo una pregunta y las respuestas, y hago clic en el botón Guardar, debería pasar a la matriz de preguntas y, al final, al hacer clic en el botón Guardar encuesta, toda la pregunta debe guardarse en la “encuesta” del esquema principal.

¿Cómo puedo hacer esto con nodejs y mongoose? Lo que intenté está aquí …

Esquema de mongoose

var mongoose = require("mongoose"); var Schema = mongoose.Schema; var SurveySchema = new Schema({ surveyname: String, question : [{ que: String, ans1: String, ans2: String, ans3: String, ans4: String }] }); module.exports=mongoose.model('Survey',SurveySchema); 

El archivo js donde guardo las entradas al esquema.

 var express = require('express'); var router = express.Router(); var survey = require('../models/QBank'); router.post('/', function(req, res, next){ new survey({ surveyname: req.body.sname, for(var i=0;i<5;i++){ question.question.push({ que: req.body.que, ans1: req.body.ans1, ans2: req.body.ans2, ans3: req.body.ans3, ans4: req.body.ans4 }); } }).save(function(err, doc){ if(err) res.json(err); else req.flash('success_msg', 'Question saved to QBank'); res.redirect("/CreateSurvey"); }); }); module.exports = router; 

Estoy atrapado aquí con mi proyecto.

Puede usar un método de actualización atómica como findOneAndUpdate() para su publicación, donde puede especificar la opción upsert . 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 operador nativo de $push para enviar la nueva pregunta y las 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 }, /*  */ { /*  */ "$push": { "question": { "que": req.body.que, "ans1": req.body.ans1, "ans2": req.body.ans2, "ans3": req.body.ans3, "ans4": req.body.ans4 } } }, { "upsert": true }, /*  */ function(err, doc){ /*  */ 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 los valores de los parámetros y se crean si 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 parámetro , y luego aplica las expresiones de parámetro .

En primer lugar, debe completar el objeto de la encuesta cuando ingrese preguntas y respuestas y presione el botón Guardar. Luego, puede usar el envío de formularios ajax para enviar los datos a la ruta deseada.

Digamos que el objeto de la encuesta es como el siguiente

 var randomSurvey = { surveyname: "randomSurvey", questions:[ { que: "question1", ans1: "answer1" ans2: "answer2" ans3: "answer3" ans4: "answer4" }, { que: "question1", ans1: "answer1" ans2: "answer2" ans3: "answer3" ans4: "answer4" } ] } 

Y cuando presiona el botón Guardar encuesta, su ruta de publicación debería ser así.

 router.post('/', function(req, res, next){ //Grab your data here sent over ajax form submit var randomSurvey = req.body.randomSurvey; var newSurvay = new survey(randomSurvey); newSurvay.save(function(err, doc){ if(err) { //do something with err } else{ // do something with the result; } res.redirect("/your_redirect_url"); }); }); 
 var survey = require('../models/QBank'); var Survey = new survey(); var question = []; question[0] = req.body.que; question[1] =req.body.ans1; // do for all Survey.question = question; survey.save(Survey, function(err, doc){}) 

De acuerdo con su descripción, puede pasar la pregunta completa para guardar en DB.

Supongo que ha pasado datos en req.body con varias preguntas. me gusta:

 {surveyname: 'your survay name', question: [{que:'q1',ans1:'a1',....},{que:'q2'..},{que:'q3',..}]} 

Si la suposición es correcta, entonces se puede usar como:

 router.post('/path', function(req, res, next){ var newSurvay = new survey({ surveyname: req.body.surveyname, question: req.body.question }); newSurvay.save(function(err, doc){ if(err) res.json(err); else req.flash('success_msg', 'Question saved to QBank'); res.redirect("/CreateSurvey"); }); });