/routes/posts.js
- .get('/:postId'): 글 상세
- post_id와 req.params.postId가 일치하는 document를 전달
- 본인의 post인지 확인하는 isMine 값 전달
- .get('/:postId/edit'): 글 수정 - 데이터 받기
- post_user와 req.user.id가 일치하는지 확인 후,
- post_id와 req.params.postId가 일치하는 document를 전달
- 사실 React 상에서 처리해줄 수 있는 부분인 것 같은데 일단은 구현해놓았다
- .post('/:postId/edit'): 글 수정
- req.body에 값이 정상적으로 담긴 경우,
- post_id와 req.params.postId가 일치하는 document를 update
- .delete('/:postId/delete'): 글 삭제
- post_id와 req.params.postId가 일치하는 document를 delete
- users collection 중 id가 req.user.id인 document의 posted 항목을 false로 변경
- .post('/:postId/newComment'): 댓글 등록
- req.body에 값이 정상적으로 담긴 경우,
- post_id와 req.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_id와 req.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_id와 req.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는 데이터 넣는 건 너무나 자유롭지만 수정하는 건 .. 그만큼 쉽지 않은 것 같다..
여담으로 티스토리는 공감 눌러준 사람 목록을 확인할 수 없어서 아쉽다. 누가 자꾸 공감 눌러주나요~!! 감사합니다.
'KDT > project' 카테고리의 다른 글
[MarkYour2022] 프로젝트 회고 (0) | 2022.12.14 |
---|---|
[MarkYour2022/backend] 3. 글쓰기 (0) | 2022.10.22 |
[MarkYour2022/backend] 2. 로그인(네이버, 카카오, 구글) (0) | 2022.10.22 |
[MarkYour2022/backend] 1. node.js 서버 기초세팅 (0) | 2022.10.21 |
[3-24] 8/1 ~ 8/15 프론트엔드 프로젝트 (0) | 2022.09.06 |