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

时间:2016-12-22 08:17:46

标签: node.js mongodb express mongoose

我正在尝试保存包含多个问题的调查。每次我输入问题和答案并单击保存按钮时,它应将其推送到问题数组,最后当我单击保存调查按钮时,整个问题应保存在父模式“调查”下。 。

如何使用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;

我被困在我的项目中。

4 个答案:

答案 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");

    });
});