我刚刚开始使用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
密钥。我现在已经调试了很多,但我找不到解决方案。
我在这里做错了什么?所以我的目标是循环一个对象数组,并检查每个对象是否存在为文档(基于问题和问题类型)。如果没有,我想创建一个新文档。