find,修改和删除recursionembedded文档mongoosejs

我从示例中使用该scheme的描述。

Comment.add({ title : { type: String, index: true } , date : Date , body : String , comments : [Comment] }); var BlogPost = new Schema({ title : { type: String, index: true } , slug : { type: String, lowercase: true, trim: true } , date : Date , buf : Buffer , comments : [Comment] , creator : Schema.ObjectId }); 

我有几个级别的嵌套评论。 如何在嵌套的任何级别find正确的评论,并采取任何行动(删除编辑或添加一个新的嵌套评论)我试图使searchrecursion,但你不能保存或删除评论

 BlogPost.methods.findComment = function (id, callback) { var curentComment = this.comments; var findComment = null; var recursiveFindComment = function(comment){ for(i=0;i<comment.length;i++){ if(findComment){ break; } if(comment[i]._id == id){ findComment = comment[i]; break; }else if(comment[i].comments.length>0){ findComment = recursiveFindComment(comment[i].comments) } } return findComment; } if(curentComment.id(id)){ callback(curentComment); }else{ callback(recursiveFindComment(curentComment, null)) } } 

你可能想看看在MongoDb中使用树( http://www.mongodb.org/display/DOCS/Trees+in+MongoDB )。 有很多不同的方法可以帮助您的模式的recursion性质。

 > t = db.tree test.tree > // get entire tree -- we use sort() to make the order nice > t.find().sort({path:1}) { "_id" : "a", "path" : "a," } { "_id" : "b", "path" : "a,b," } { "_id" : "c", "path" : "a,b,c," } { "_id" : "d", "path" : "a,b,d," } { "_id" : "g", "path" : "a,b,g," } { "_id" : "e", "path" : "a,e," } { "_id" : "f", "path" : "a,e,f," } { "_id" : "g", "path" : "a,b,g," } > t.ensureIndex( {path:1} ) > // find the node 'b' and all its descendents: > t.find( { path : /^a,b,/ } ) { "_id" : "b", "path" : "a,b," } { "_id" : "c", "path" : "a,b,c," } { "_id" : "d", "path" : "a,b,d," } { "_id" : "g", "path" : "a,b,g," } > // find the node 'b' and its descendents, where path to 'b' is not already known: > nodeb = t.findOne( { _id : "b" } ) { "_id" : "b", "path" : "a,b," } > t.find( { path : new RegExp("^" + nodeb.path) } ) { "_id" : "b", "path" : "a,b," } { "_id" : "c", "path" : "a,b,c," } { "_id" : "d", "path" : "a,b,d," } { "_id" : "g", "path" : "a,b,g," }