node.js - 如果文档的 _id 已经存在,如何将数组元素推送到数组;如果 _id 不存在,如何创建新文档?

标签 node.js mongodb mongoose

我正在使用 Node.jsmongoosemongodbexpressAngular. 我正在保存 Mongoose 模型调查的回复。许多人会提交特定调查的答复。当第一个人提交调查回复时,我想为该调查创建一个新文档。当第二个、第三个......等等人们提交同一调查的回复时,我只想将数组元素添加到以下架构中的回复数组中。

当第一个人提交新调查的回复时,我想为新调查创建一个新文档。我怎样才能在 Mongoose 中做到这一点?

我在Mongoose.js: how to implement create or update?中发现了类似的问题。 但是,如果找到_id,我想将新回复推送到replies[]的下一个数组索引,否则创建一个新文档

Mongoose 模型:

 var mongoose = require("mongoose");
 var Schema = mongoose.Schema;

 var MCQReplySchema = new Schema({ 

    _id : String,
    surveyname: String,
    replies :[{
        replierId : String,
        answers : [{
            questionId : String,
            answer : String
        }]  
    }]

    });

 module.exports=mongoose.model('MCQReply',MCQReplySchema);

将数据保存到数据库:

      router.post("/saveMCQAnswer", function(req, res) {

       new MCQReply({

       _id : '123',
        surveyname: 'sample',
        replies :[{
          replierId : 'R001',
          answers : [{
            questionId : 'A001',
            answer : 'answer'
          }]  
        }]

    }).save(function(err, doc){
      if(err) res.json(err);
      else
      req.flash('success_msg', 'User registered to Database');  
      res.redirect("/");

    });

   });

最佳答案

未经测试的伪代码。

    MCQReply.findOne({_id : the id}, function(err,doc){
        if(err) console.log(err);
        // if the survey isn't there `doc` will be null then do your save
        if(!doc){
          new MCQReply({

           _id : '123',
            surveyname: 'sample',
            replies :[{
              replierId : 'R001',
              answers : [{
                questionId : 'A001',
                answer : 'answer'
              }]  
            }]

            }).save(function(err, doc){
              if(err) res.json(err);
              else
              req.flash('success_msg', 'User registered to Database');  
              res.redirect("/");

            });                 
        }else(doc){
            //you get mongoose document
            doc.replies.push({replierId : "R001", answer : [{questionId : "A001" ... whatever else you want}]})

            //dont forget to save
            doc.save(do error check)
        }


    })

不知道这是否有效,但如果您在保存 _id 时遇到问题,请尝试使用 Schema()

var MCQReplySchema = new Schema({ 

    _id : String,
    surveyname: String,
    replies :[{
        replierId : String,
        answers : [{
            questionId : String,
            answer : String
        }]  
    }]

    }, {strict : false});

如果{strict :false}不起作用

尝试 {strict : false, _id :false} 或只是 _id : false

关于node.js - 如果文档的 _id 已经存在,如何将数组元素推送到数组;如果 _id 不存在,如何创建新文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42664521/

相关文章:

node.js - 在 Azure Linux Web 应用程序上升级 Node.js 版本?

ruby - 您将如何在 MongoDB 中有效地实现这些查询?

mongodb - Mongoose 是否支持 Mongodb `findAndModify` 方法?

node.js - Node Selenium ChromeDriver Ubuntu NoSuchSessionError : This driver instance does not have a valid session ID

node.js - Node js buffer.toString() 编码问题

javascript - puppeteer 的 setContent 函数不会对静态文件发出网络请求

java - Spring Data MongoDB 错误

javascript - 回调不是 mongoose.find({}) 中的函数

node.js - Mongoose findbyid() 返回 null

javascript - 分配属性值在 Mongoose 中不起作用