我正在尝试保存包含多个问题的调查。每次我输入问题和答案并单击保存按钮时,它应将其推送到问题数组,最后当我单击保存调查按钮时,整个问题应保存在父模式“调查”下。 。
如何使用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);
我将输入保存到架构的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;
我被困在我的项目中。
答案 0 :(得分:1)
您可以为帖子使用 findOneAndUpdate()
等原子更新方法,您可以在其中指定upsert
选项。如果upsert
为真且没有文档符合查询条件, findOneAndUpdate()
会插入单个文档。在这里你也可以使用原生
$push
运算符用于推送问题数组的新问题和答案,而不是在让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;
在上文中,如果<query>
参数包含更新运算符表达式,则会创建<update>
和<update>
参数的字段和值。此更新根据<query>
参数中的等于子句创建基本文档,然后应用<update>
参数中的更新表达式。
答案 1 :(得分:1)
首先,当您输入问题和答案并点击“保存”按钮时,您需要填充调查对象。然后您可以使用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"
}
]
}
当您按下保存调查按钮时,您的发布路径应该是这样的。
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");
});
});
答案 2 :(得分:0)
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){})
答案 3 :(得分:0)
根据您的描述,您可以通过完整的问题保存在数据库中。
假设您在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");
});
});