如何更新(删除)嵌套数组中的文档

时间:2013-08-30 19:49:25

标签: node.js mongodb mongoose

我在mongoose中实现了mongodb的测试模式。

var TestSchema = new mongoose.Schema({ exam:[ Exam ] });

var ExamSchema  = mongoose.Schema({type:String, questions: [  { question:{ type: ObjectId, ref: 'Question' }, answer:String } ]    });

var QuestionSchema = mongoose.Schema({ desciption:String, solution:String });

测试的想法是,学生可以参加几个考试的考试,每个考试都有一个类型名称(可能是数学或物理)和一个问题ObjectID列表以及学生填写的相应答案。

此代码可以帮助在测试中为某些考试添加新的问题和答案     TestModel.update({ '_ ID':PID, 'exam.type':类型},{ '$推':{ '$考试题':{ '问题':questionsId, '答案':答案}}} ,选项,功能(ERR,REF){         if(错误){             console.log('将问题添加到Exam'.red,错误);             回调(错误,null);         }其他{             console.log('向Exam'.green + ref添加问题);
            回调(NULL,REF);         }     }) 通过添加它可以很好地工作,但它是删除问题和答案,更新不起作用。

Model.update({'_id':pid,'exam.type':type},{'$pull':{'exam.$.questions':questionId}},options,function(err,ref)

Model.update({'_id':pid,'exam.type':type},{'$pull':{'exam.$.questions.question':questionId}},options,function(err,ref)

Model.update({'_id':pid,'exam.type':type,'exam.questions.question':questionId},{'$pull':{'exam.$.questions.$.question':questionId}},options,function(err,ref)

Model.update({'_id':pid,'exam.type':type,'exam.questions.question':questionId},{'$pull':{'exam.questions.$.question':questionId}},options,function(err,ref)

我尝试了这些方法,但这些方法都不起作用

2 个答案:

答案 0 :(得分:0)

在下一个修饰符中使用 $ 运算符:

{'$pull': {'exam.$.questions': questionId}

您必须先在查询中使用 $elemMatch: 运算符:

{'_id': pid, exam: { $elemMatch: {type: type} } }

答案 1 :(得分:-2)

其他人可能会提供mongo语法答案。

我喜欢的流星的一个方面是你到处都可以使用javascript / coffeescript。我谦卑地建议你将这个策略扩展到你使用mongo更新。我发现自己只是直接使用我的json /对象操作能力而且$设置整个事情,而不是学习另一种语法。有人会说,限制你检索的字段是不成熟的优化,直到证明它会产生影响,所以你可能无论如何都要检索数据。