如何将input数组保存在嵌套mongoose模式中的子模式?

我试图保存包含多个问题的调查。 每次我input一个问题和答案,并点击保存button,它应该把它推到问题数组,最后当我点击保存调查button时,整个问题应保存在父模式“调查”下。

我怎样才能做到这一点nodejs和mongoose? 我试过的是这里….

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); 

将input保存到模式的js文件

 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; 

我被困在这里与我的项目。

您可以使用像findOneAndUpdate()这样的primefaces更新方法来指定upsert选项。 如果upsert为true并且没有文档匹配查询条件,则findOneAndUpdate()将插入单个文档。 在这里,你也可以使用本地的$push操作符将新的问题和答案推送到question数组中,而不是在让mongo在服务器上完成所有工作时使用循环。

以下示例显示了如何重构代码:

 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; 

在上面,如果<update>参数包含更新运算符expression式,则创build<query><update>参数的字段和值。 该更新将使用<query>参数中的equality子句创build基本文档,然后应用<update>参数中的更新expression式。

首先你需要填入你的调查对象,当你input问题和答案,并点击保存button。然后你可以使用Ajax表单提交发送到所需的路线的数据。

假设调查对象如下所示

 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" } ] } 

而当你按保存调查button,那么你的邮政路线应该是这样的。

 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){}) 

根据您的描述,您可以通过完整的问题保存在数据库中。

假设你在req.body传递了多个问题的数据。 喜欢:

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

如果假设是正确的,那么可以使用像:

 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"); }); });