KDT/project

[MarkYour2022/backend] 4. 글 상세, 수정, 삭제, 댓글 등록, 수정, 삭제

ebulsok 2022. 10. 23. 23:21

/routes/posts.js

  • .get('/:postId'): 글 상세
    • post_idreq.params.postId가 일치하는 document를 전달
    • 본인의 post인지 확인하는 isMine 값 전달

 

  • .get('/:postId/edit'): 글 수정 - 데이터 받기
    • post_userreq.user.id가 일치하는지 확인 후,
    • post_idreq.params.postId가 일치하는 document를 전달
    • 사실 React 상에서 처리해줄 수 있는 부분인 것 같은데 일단은 구현해놓았다

 

  • .post('/:postId/edit'): 글 수정
    • req.body에 값이 정상적으로 담긴 경우,
    • post_id req.params.postId가 일치하는 document를 update

 

  • .delete('/:postId/delete'): 글 삭제
    • post_idreq.params.postId가 일치하는 document를 delete
    • users collection 중 idreq.user.id인 document의 posted 항목을 false로 변경

 

  • .post('/:postId/newComment'): 댓글 등록
    • req.body에 값이 정상적으로 담긴 경우,
    • post_idreq.params.postId가 일치하는 document의 post_comments(배열)에 $push
    • commentId의 경우, post_comments 마지막 항목의 comment_id + 1 값으로 설정

https://www.mongodb.com/docs/manual/reference/operator/update/push/#example-push-each

 

$push — MongoDB Manual

Docs Home → MongoDB Manual $pushThe $push operator appends a specified value to an array.The $push operator has the form:{ $push: { : , ... } }To specify a in an embedded document or in an array, use dot notation.Starting in MongoDB 5.0, update operators

www.mongodb.com

 

  • .post('/:postId/:commentId/editComment'): 댓글 수정
    • req.body에 값이 정상적으로 담긴 경우,
    • post_idreq.params.postId가 일치하는 document에서 findOneAndUpdate arrayFilters를 활용하여 배열 수정

https://www.mongodb.com/docs/manual/reference/method/db.collection.findOneAndUpdate/

 

db.collection.findOneAndUpdate() — MongoDB Manual

Docs Home → MongoDB Manual db.collection.findOneAndUpdate( filter, update, options )mongosh MethodThis page documents a mongosh method. This is not the documentation for a language-specific driver, such as Node.js.For MongoDB API drivers, refer to the la

www.mongodb.com

https://oneshottenkill.tistory.com/317

 

MongoDB findOneAndUpdate

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 {     "_id" : ObjectId("5b77cf25cdc3bb21d0354be2"),     "title" : "newnew",     "updated" : [ ],     "date" : ISO..

oneshottenkill.tistory.com

 

  • .delete('/:postId/:commentId/delComment'): 댓글 삭제
    • post_idreq.params.postId가 일치하는 document에서 updateOne$pull을 활용하여 배열 삭제
    • 댓글 비밀번호 확인은 프론트에서 처리해주면 되기 때문에 별도의 확인 처리는 하지 않았다

https://www.mongodb.com/docs/manual/reference/operator/update/pull/

 

$pull — MongoDB Manual

Docs Home → MongoDB Manual $pullThe $pull operator removes from an existing array all instances of a value or values that match a specified condition.The $pull operator has the form:{ $pull: { : , : , ... } }To specify a in an embedded document or in an

www.mongodb.com


우와 기본적인 기능들은 끝~!

이긴 하지만 프론트랑 합치는 과정에서 많은 수정이 생길 것 같다.. 그래서 오늘까지 기본 기능 구현을 끝내려고 한 것도 있다. 앞으로가 시작일듯

 

오늘 애먹은 부분은 댓글 수정 부분이다.

post_comments가 배열로 구현이 되어있기 때문에....

나는 post_id로 document를 찾고, 그 document의 post_comments 중 comment_id가 일치하는 배열을 수정해야 한다.

 

1. 그 배열값을 통째로 삭제하고 새롭게 $push하면 간단했겠지만, '수정'이라는 기능에 부합하지 않는 것 같고 조금 꼼수인 것 같고 db 상의 정렬도 망치기 때문에 패스했다

2. 수정된 댓글과 원래 있던 댓글들로 새로운 post_comments를 만들어서 updateOne-$set 을 하는 방법 -> 만약에 댓글이 엄청 많다면 효율적이지 못한 로직이 될 것 같아 패스했다.

결론적으로 updateOne-$set 조합을 사용할 수 없었고 배열 쿼리 중 $addToSet도 맞지 않았다.

 

mongodb 배열 수정 으로 구글링해도 다 똑같은 소리들만 하길래(그냥 기본적인 쿼리들만 알려주는..)

vscode 상에서 어떤 메소드가 있는지 확인하다가 

요런식으로

findOneAndUpdate가 그럴듯해보이길래 구글링했고, 위에 링크한 공식문서와 어떤 블로그글을 보니 써먹을 수 있겠다 싶었다.

여튼 해결~!

mongoDB는 데이터 넣는 건 너무나 자유롭지만 수정하는 건 .. 그만큼 쉽지 않은 것 같다..

 

여담으로 티스토리는 공감 눌러준 사람 목록을 확인할 수 없어서 아쉽다. 누가 자꾸 공감 눌러주나요~!! 감사합니다.