2017-04-24 2 views
0

토런트 항목이 있고 하위 사용자에게 저장된 사용자 주석에 '_replies'라는 이름의 하위 문서 배열이 있으며 모든 주석에도 저장된 사용자 응답에 '_replies'라는 하위 문서 배열이 포함되어 있습니다.mongoose 다중 레벨 하위 문서를 수정 한 다음 정상적으로 저장하지 않음

var CommentSchema = new Schema({ 
    user: { 
    type: Schema.Types.ObjectId, 
    ref: 'User' 
    }, 
    comment: { 
    type: String, 
    default: '', 
    trim: true 
    }, 
    _replies: [this], 
    createdat: { 
    type: Date, 
    default: Date.now 
    }, 
    editedby: { 
    type: String, 
    default: '', 
    trim: true 
    }, 
    editedat: { 
    type: Date, 
    default: '' 
    } 
}); 

var TorrentSchema = new Schema({ 
    user: { 
    type: Schema.Types.ObjectId, 
    ref: 'User' 
    }, 
    torrent_filename: { 
    type: String, 
    default: '', 
    trim: true, 
    required: 'filename cannot be blank' 
    }, 
    torrent_title: { 
    type: String, 
    default: '', 
    trim: true, 
    required: 'title cannot be blank' 
    }, 
    _replies: [CommentSchema] 
}); 

mongoose.model('Torrent', TorrentSchema); 
mongoose.model('Comment', CommentSchema); 

토런트 업데이트의 첫 번째 수준의 댓글/미세 삭제, 서버 컨트롤러의 코드는 아래 추천했습니다 : : 모든 스키마 정의

exports.update = function (req, res) { 
    var torrent = req.torrent; 

    torrent._replies.forEach(function (r) { 
    if (r._id.equals(req.params.commentId)) { 
     r.comment = req.body.comment; 
     r.editedat = Date.now(); 
     r.editedby = req.user.displayName; 

     torrent.save(function (err) { 
     if (err) { 
      return res.status(422).send({ 
      message: errorHandler.getErrorMessage(err) 
      }); 
     } else { 
      res.json(torrent); //return data is Correct, and save to mongo is Correct 
     } 
     }); 
    } 
    }); 
}; 

을하지만 난 업데이트 허락 기능을 사용할 때/_replies._replies 삭제 , 응답에 Torrent의 올바른 json을 반환 할 수 있습니다. 운이 미세하지 몽고에 저장 코드 : 또한

exports.SubUpdate = function (req, res) { 
    var torrent = req.torrent; 

    torrent._replies.forEach(function (r) { 
    if (r._id.equals(req.params.commentId)) { 
     r._replies.forEach(function (s) { 
     if (s._id.equals(req.params.subCommentId)) { 
      s.comment = req.body.comment; 
      s.editedat = Date.now(); 
      s.editedby = req.user.displayName; 

      torrent.save(function (err) { 
      if (err) { 
       return res.status(422).send({ 
       message: errorHandler.getErrorMessage(err) 
       }); 
      } else { 
       res.json(torrent);//return data is Correct, but save to mongo is incorrect 
      } 
      }); 
     } 
     }); 
    } 
    }); 
}; 

, 내가 첫 번째 수준의 코멘트를 삭제할 수 있지만 두 번째 수준의 답글을 삭제할 수 없습니다가, 토런트의 모든 JSON 데이터가 올바른지 만에 저장할 수 없습니다 몽고.

나는 무엇을 할 수 있습니까?

답변

0

이미 해결되었으므로 .save() 전에이 코드를 추가합니다.

torrent.markModified('_replies'); 

잘 작동합니다.

관련 문제