다오의 개발일지

TIL-3 mongoDB에서 _id값을 가져와 댓글 판별 하기 본문

WTIL

TIL-3 mongoDB에서 _id값을 가져와 댓글 판별 하기

다오__ 2023. 5. 16. 20:31

https://dao-blog.tistory.com/6

 

스파르타 코딩클럽 미니 프로젝트 - 2 팀 소개 페이지 0515~0519

노션 링크 https://teamsparta.notion.site/A-2-S-A-bbbe088d2d544ff5b4fa050bd1740b66 A-2팀 S.A. S.A. 내용 teamsparta.notion.site 메인 페이지 와이어프레임 링크 : https://wireframe.cc/NDEubd Wireframe.cc | The go-to wireframing tool. A power

dao-blog.tistory.com

 

현재 진행중인 미니 프로젝트인 팀 소개페이지를 만들다가 댓글 기능 구현하는데 문제에 부딛혔다.

MySQL만 사용을 하다 MongoDB를 처음 사용해보기 시작했고 그래서 문법을 정확히 파악을 못한채로 시작하게 되었는데

MongoDB같은 경우에는 auto_increment 같이 데이터가 저장될 때 자동으로 값을 증가시키는 속성이 없고 따라서 처음에는 직접 auto_increment과 같은 기능을 할 수 있게 구현을 하려고 했다.

그런데 mongoDB에서 데이터가 저장될 때마다 고유의 id값을 가진다는것을 알게됬고(_id속성) 우리는 이 속성을 사용하기로 결정했다..

db.comment.find({},{"_id": True})

처음에는 단순하게 _id값을 False에서 True 변경했지만 당연하게도 에러가 발생했다.

list(db.comment.find({}, projection={"_id": True},batch_size=1000000))

이후에 몽고DB에 대한 글을 찾아보았지만 명쾌한 답을 찾지 못했다.

fetch('/reply/comments').then((res) => res.json()).then((data) => {
list = data['result']
let idx = parseInt(list[list.length - 1]['id']) + 1
let id = Number(idx)

그래서 다시 되돌아가 auto_increment기능을 구현해냈지만, 몽고DB에서 사용하라고 만들어둔 기능을 쓰지 못하는것에 대한 아쉬움으로 계속 찾아보았다.

_id의 타입이 ObjectId라는 것을 알게됬고 관련해서 알아보았다.

MongoDB는 ObjectId라는 타입을 지원하는데 이는 RDBMS에서 Primary Key와 같은 고유한 키를 의미한다.

Collections에 데이터를 넣을때 ObjectId를 직접 넣어주지않아도 값이 자동부여되며 모든 Document들은 각각의 ObjectId가 생긴다.

ObjectId의 구조

-참고-

https://docs.mongodb.com/manual/reference/method/ObjectId/#examples
https://kciter.so/posts/about-mongodb

 

ObjectId() — MongoDB Manual

Docs Home → MongoDB Manual ObjectId( )Returns a new ObjectId. The 12-byte ObjectId consists of:A 4-byte timestamp, representing the ObjectId's creation, measured in seconds since the Unix epoch.A 5-byte random value generated once per process. This rando

www.mongodb.com

 

ObjectId를 다루기 위해서는 bson이라는 라이브러리 또한 필요했다.

BSON(Binary JSON)이란?

BSON은 JSON 형태의 문서를 바이너리 형태로 인코딩한 바이트 문자열이다.

db.find_one({'_id':ObjectId('5f6d775c29be48f7e50ea68e')})

위의 코드들을 응용하여 우리 코드에도 적용하였다.

all_reply =list(db.comment.find({}, projection={"_id": True,}, batch_size=100000)))
return jsonify({'result':all_reply})

우리의 목표는 comment테이블의 모든 데이터 (_id포함)를 조회하는 것인데 여기서 문제가 발생했다.

_id값만 넘어오게 되었고 또한 ObjectId 타입은 jsonify로 return을 할 수가 없었다.

def id_get():

    all_reply = list(db.comment.find({}, projection={"_id": True, "membername": True , "nickname": True, "content": True, "password": True}, batch_size=100000))
    all_reply = [{'_id': str(reply['_id']), 'membername': reply['membername'] , 'nickname': reply['nickname'] ,'content': reply['content'] ,'password': reply['password']} for reply in all_reply]
    all_reply.reverse()

    return jsonify({'result':all_reply})

서로 의논한 결과
이렇게 projection 뒤에 모든 속성을 True로 하고, 아래에는 ObjectId타입을 str로 변환하여 jsonify 방식으로 드디어
데이터를 넘기기에 성공하였다.

댓글을 삭제하는 기능 또한 구현하였는데 아래를 보면,

@app.route("/delete_comment")
def delete_comment():
   idx = request.args.get('_id')
   member = request.args.get('membername')
   print(member)
   all_reply_id = list(db.comment.find({}, projection={"_id": True}, batch_size=100000))
   for i in all_reply_id:
      if i['_id'] == ObjectId(idx):
         db.comment.delete_one({'_id': i['_id']})

_id값을 idx로 변수에 담고 이를 다시 ObjectId타입으로 변환해주는 과정이 필요하다.

이를 통해 무사히 댓글의 조회와 삭제기능을 구현할 수 있었다.

'WTIL' 카테고리의 다른 글

TIL-14 JWT를 스프링에서 사용해보기  (0) 2023.06.20
WIL-5 5주차 WIL  (0) 2023.06.18
WIL-4 4주차 WIL  (1) 2023.06.11
WIL-2 2주차 키오스크 개발과제 및 강의 후기  (0) 2023.05.30
WIL-1 팀 프로젝트를 마무리 하며,  (1) 2023.05.21