Node.js Mongoose,查找文档并保存,如果找不到

时间:2018-03-17 17:31:17

标签: node.js mongodb mongoose

我刚刚开始使用Mongoose,但有一些我不明白的事情。我搜索了Stack Overflow并在网上搜索了错误,但没有找到正确的答案。

查找,保存文档不存在
我正在创建一个用户可以添加多个问题的功能。这些问题作为对象存储在数组中。像这样:

const questions = [
  {
    global_id: 'id',
    question: 'question',
    type: 'multipleChoice',
    answers: ['a1', 'a2', 'a3', 'a4'],
    // more data
  }, 
  // more instances
];

这是模型

/* Mongoose model for Global Questions */
const GlobalQuestionSchema = mongoose.Schema({
  global_id: String,
  number: Number,
  connected_playwalls: Array,
  created_by: String,
  created_at: Date,
  question: String,
  type: String,
  total_answers: Number,
  answers: Array,
  valid: Number,
  answer_count: Array,
  average_duration: Number,
  images: Array,
  check: Boolean
});

const GlobalQuestion = module.exports = mongoose.model('GlobalQuestion', GlobalQuestionSchema);

当用户发布数据时,我首先想要循环遍历数组中的所有实例,并使用Mongoose查找功能查看是否已存在具有相同问题和问题类型的文档。我就是这样做的:

const save = {
  questionsTest(questions, req) { // questions is the array as above
    questions.forEach(function(question) {
      GlobalQuestion.checkIfExists(question, (err, data) => { 
         if(err) { console.log(err); };
          if(data != null) { // data is a single question object
            GlobalQuestion.createNew(data, (err, result) => {
               if(err) { console.log(err); };
               console.log(result);
           });
          }
       });
    })
}

这是GlobalQuestion.checkIfExists函数

module.exports.checkIfExists = function(data, callback) {
  GlobalQuestion.findOne({
    question: data.question,
    type: data.type
  }, function(error, result) {
      if(error) { console.log(error); }
      console.log(result); // Return nulls now, the document doesn't exist yet          
      if(result == null) {
        callback(error, data);
      } else {
        callback('Question already exists', true);
      }
  });
};

这是GlobalQuestion.createNew函数

module.exports.createNew = function(data, callback) {
  let question = new GlobalQuestion(data);
  question.save(function (err) {
    if (err) { console.log(err); }
  });
}

GlobalQuestion.checkIfExists的回调中,在结果中返回一个对象。该对象包含一个问题。 createNew函数为第一个问题创建了一个文档,但之后我收到了这个错误:

BulkWriteError: E11000 duplicate key error index: playwall-test-server.globalquestions.$id_1 dup key: { : null }

奇怪的是,问题对象没有id密钥,而是global_id密钥。我现在已经调试了很多,但我找不到解决方案。

我在这里做错了什么?所以我的目标是循环一个对象数组,并检查每个对象是否存在为文档(基于问题和问题类型)。如果没有,我想创建一个新文档。

0 个答案:

没有答案