【问题标题】:Find, modificate and remove recursive embedded-document mongoosejs查找,修改和删除递归嵌入文档猫鼬js
【发布时间】:2012-10-08 05:15:00
【问题描述】:

我使用示例中的方案描述。

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
});

我在 cmets 中有几个级别的嵌套。 如何在任何嵌套级别找到正确的评论并对其进行任何操作(删除编辑或添加新的嵌套评论) 我尝试对搜索进行递归,但您无法保存或删除 cmets

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)) 
  }
}

【问题讨论】:

    标签: node.js mongoose


    【解决方案1】:

    您可能想看看在 MongoDb (http://www.mongodb.org/display/DOCS/Trees+in+MongoDB) 中使用树。有许多不同的方法可以帮助您处理架构的递归性质。

    > 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," }
    

    【讨论】:

      猜你喜欢
      • 2016-11-09
      • 2015-09-06
      • 2020-06-04
      • 1970-01-01
      • 1970-01-01
      • 2019-06-06
      • 1970-01-01
      • 2014-02-03
      相关资源
      最近更新 更多