如何在Mongoose的Quiz Schema中实现数据创建与更新?
Mongoose Quiz 数据插入与更新问题解决
首先明确核心问题:你的Schema里题目字段拼写错误,写成了qusetions(正确应为questions),这就是插入时该字段始终为空的原因——你插入数据时大概率用了正确拼写的questions,和Schema里的字段名不匹配,导致数据没被存入。
建议先修正Schema中的字段名,把qusetions改成questions,避免后续维护出现混淆。
数据插入(使用create方法)
修正Schema后,按以下示例插入数据,确保字段名和Schema完全一致:
const Quizmodel = require('./path/to/Quizmodel'); // 构造Quiz数据 const newQuizData = { course: '650abc123def456ghi789', // 替换为实际的course ObjectId topic: '650def456ghi789abc123', // 替换为实际的topic ObjectId quiztime: new Date('2024-10-05 14:00:00'), allowedtime: new Date('2024-10-05 14:45:00'), questions: [ { questiontext: 'Node.js是什么类型的运行环境?', correctans: 'JavaScript运行时', opt1val: 'JavaScript运行时', opt2val: 'Python框架', opt3val: '数据库管理系统', opt4val: '前端构建工具' }, { questiontext: 'Mongoose用于操作哪种数据库?', correctans: 'MongoDB', opt1val: 'MySQL', opt2val: 'MongoDB', opt3val: 'PostgreSQL', opt4val: 'Redis' } ], students: [] // 初始无学生答题,可留空 }; // 执行插入 Quizmodel.create(newQuizData) .then(createdQuiz => console.log('数据插入成功:', createdQuiz)) .catch(err => console.error('插入失败:', err));
如果暂时不想修改Schema,插入时必须使用qusetions作为字段名,但强烈建议修正拼写错误。
数据更新
1. 给Quiz添加题目
使用$push添加单题,或$push配合$each批量添加:
// 添加单个题目 Quizmodel.findByIdAndUpdate( '650xyz789abc123def456', // 目标Quiz的ObjectId { $push: { questions: { questiontext: 'Express是什么?', correctans: 'Node.js web框架', opt1val: 'Node.js web框架', opt2val: '数据库', opt3val: '编程语言', opt4val: '操作系统' } } }, { new: true } // 返回更新后的完整文档 ) .then(updatedQuiz => console.log('添加题目成功:', updatedQuiz)) .catch(err => console.error('添加失败:', err)); // 批量添加题目 Quizmodel.updateOne( { _id: '650xyz789abc123def456' }, { $push: { questions: { $each: [ { questiontext: 'MongoDB是哪种数据库?', correctans: '非关系型数据库', opt1val: '关系型', opt2val: '非关系型', opt3val: '内存型', opt4val: '列式' }, { questiontext: 'Mongoose的Schema作用是?', correctans: '定义数据结构', opt1val: '定义数据结构', opt2val: '执行SQL查询', opt3val: '处理HTTP请求', opt4val: '存储文件' } ] } } }, { new: true } ) .then(result => console.log('批量添加成功:', result)) .catch(err => console.error('批量添加失败:', err));
2. 修改特定题目
通过匹配题目属性(如questiontext)定位并修改:
Quizmodel.updateOne( { _id: '650xyz789abc123def456', 'questions.questiontext': 'Node.js是什么类型的运行环境?' }, { $set: { 'questions.$.correctans': '基于Chrome V8引擎的JavaScript运行时', 'questions.$.opt1val': '基于Chrome V8引擎的JavaScript运行时' } } ) .then(result => console.log('题目修改成功:', result)) .catch(err => console.error('修改失败:', err));
3. 添加学生答题记录
给students数组添加学生信息及所选答案:
Quizmodel.findByIdAndUpdate( '650xyz789abc123def456', { $push: { students: { student: '651abc456def789ghi123', // 实际学生的ObjectId selectedans: [ { anstext: 'JavaScript运行时' }, { anstext: 'MongoDB' } ] } } }, { new: true } ) .then(updatedQuiz => console.log('学生答题记录添加成功:', updatedQuiz)) .catch(err => console.error('添加失败:', err));
内容的提问来源于stack exchange,提问作者Waqar Ahmed
相关产品推荐
相关产品推荐

