【问题标题】:How to save array of inputs to a child schema in a nested mongoose schema?如何将输入数组保存到嵌套猫鼬模式中的子模式?
【发布时间】:2017-05-07 19:27:17
【问题描述】:

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

如何使用 nodejs 和猫鼬做到这一点?我试过的就在这里....

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;

我的项目被困在这里。

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

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

    假设您在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");
    
        });
    });
    

    【讨论】:

    • 如何从前端传递您上面所说的多个问题?
    • 首先将所有问题推送到数组中,然后设置在对象var question = [{que:'q1',ans1:'a1',....},{que:'q2'..},{que:'q3',..}]; var data = {sname: 'your survay name', question: question}; 中,然后在http 调用$http.post('/path', data) 中发送此数据
    • 我不知道如何将所有问题推送到数组中。你能帮帮我吗?
    • 您使用的是 angular.js 还是您的前端技术调用 API?
    • 添加了该问题的答案
    【解决方案2】:

    首先,当您输入问题和答案并点击保存按钮时,您需要填充您的调查对象。然后您可以使用 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");    
      });
    });
    

    【讨论】:

      【解决方案3】:
      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){})
      

      【讨论】:

      • 一个问题里面一定有答案。
      • 我试过上面的答案。但我收到此错误:TypeError:survey.save is not a function
      【解决方案4】:

      您可以为您的帖子使用像 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;
      

      在上面,如果&lt;update&gt; 参数包含更新运算符表达式,则会创建&lt;query&gt;&lt;update&gt; 参数的字段和值。更新从&lt;query&gt; 参数中的相等子句创建一个基础文档,然后应用&lt;update&gt; 参数中的更新表达式。

      【讨论】:

      • 太棒了!我尝试了您的答案,并且效果很好。它不断在调查中添加问题。如何终止此并开始新的调查?我是初学者,请帮助我。
      • 以上对于PUT HTTP 动词是理想的,即通过向数组添加问题来更新现有调查。但是,您可以将create()save() 方法用于POST,文档中有一些示例说明如何进行此操作。
      猜你喜欢
      • 2019-04-18
      • 2017-06-12
      • 2015-09-21
      • 2019-03-22
      • 1970-01-01
      • 2016-11-18
      • 2014-06-22
      • 2021-10-06
      • 1970-01-01
      相关资源
      最近更新 更多