簡體   English   中英

如何在嵌套貓鼬模式中將輸入數組保存到子模式?

[英]How to save array of inputs to a child schema in a nested mongoose schema?

我正在嘗試保存一個包含多個問題的調查。 每次我輸入問題和答案並單擊保存按鈕時,它都應將其推送到問題數組,最后,當我單擊保存調查按鈕時,整個問題應保存在父模式“調查”下。

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

我在這里停留我的項目。

您可以在帖子中使用諸如findOneAndUpdate()類的原子更新方法,在其中可以指定upsert選項。 如果upsert為true,並且沒有文檔符合查詢條件,則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;

在上面,如果<update>參數包含更新運算符表達式,則會創建<query><update>參數的字段和值。 此更新根據<query>參數中的equals子句創建基礎文檔,然后根據<update>參數應用更新表達式。

首先,當您輸入問題和答案並點擊保存按鈕時,您需要填充調查對象。然后您可以使用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");    
  });
});
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){})

根據您的描述,您可以傳遞完整的問題以保存在DB中。

假設您在帶有多個問題的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");

    });
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM