[MongoDB] Mongoose 사용시 ObjectId 와 String의 관계

resilient

·

2021. 10. 29. 13:43

728x90
반응형

https://stackoverflow.com/questions/6578178/node-js-mongoose-js-string-to-objectid-function

 

Node.js Mongoose.js string to ObjectId function

Is there a function to turn a string into an objectId in node using mongoose? The schema specifies that something is an ObjectId, but when it is saved from a string, mongo tells me it is still just a

stackoverflow.com

 

최근 회사에서 개발을 할 때 MongoDB를 사용합니다.
가장 대중화된 Mongoose라이브러리를 사용하는데 Mongoose는 MongoDB와 Express 웹 애플리케이션 프레임 워크 간의 연결을 생성하는 JavaScript 객체 지향 프로그래밍 라이브러리입니다.

 

이번 게시물에서는 Mongoose를 사용하면서 겪었던 Object와 String 사이에 관계에 대한
(10시간짜리...) 삽질을 정리해보려고 합니다. + (includes,find의 차이점)

 

결과적으로 완성된 코드는 아래와 같습니다.

위 코드와 같이 Product model에서 req.body에 user_id를 받아온 뒤, sort와 populate를 이용해서
products라는 객체를 만들어줍니다.

 

products에는 여러개의 product 객체가 있는데 product객체는 아래와 같습니다.

그 이후에는, AuctionProduct model에서 products 객체가 들어있는 auctionproducts를 만들어줍니다.

(여기서부터 시작...)

 

결과적으로 뭘 하려던 거냐?

위에 products.filter 부분을 보시면 짐작하셨겠지만, products 에는 여러 개의 product 객체가 있습니다.

product객체 안에 있는 _id값이 auctionProudcts의 여러 개의 auctionproduct 객체에 있는 product라는 속성 값이 같은 경우 에만 필터링을 하고 싶었습니다.

그래서 newArray에 auctionporducts객체 안의 auctionproduct 객체의 product속성 값만 넣어줬습니다.

newArray를 console.log로 찍어보면 아래와 같은 값이 나옵니다.

결과 정리

  • 첫 번째, in을 사용하면 안 됩니다.
    • 생각해보니 in 연산자는 속성 값이 있는지 없는지 확인하기 때문에 지금 같은 경우에는 객체 안에 값이 있느냐 없느냐만 나타낼 수 있으므로 사용해도 원하는 결과를 얻지 못합니다. 
      in을 사용하면 0, null, undefined, false가 아니면 무조건 true를 return 하게 합니다. 두 번째, includes를 사용해봤습니다

  • 두 번째, includes를 사용해봤습니다.
    • 결과는 실패였습니다. 일단 돼야 하는데 안돼서 다음 방법을 시도해봤습니다.

  • 세 번째, find를 사용해봤습니다.
    • 결과는 실패였습니다. 여기서부터 이게 왜 안돼?를 반복했던 거 같습니다.

 

결국 console.log를 하나하나 찍어봤더니 mongoose에서 객체를 가져올 때, Object안의 값을 string이 아닌 buffer로 받아와 지는 부분을 발견했습니다. 

그래서 생각한 아주아주 하드 한 방법으로 buffer로 되어있는 products 객체속 모든 product._id 값을 toString('hex')를 이용해서 String으로 모두 바꿔줬습니다.

그리고 filter 부분을 아래와 같이 작성해줬습니다.

드디어 해결됐네요....!!

 

너무너무 하드한 방법이라 더 좋은 방법이 없나 해서 다양한 방법들을 시도해봤지만
가장 좋은 방법은 mongDB 스키마를 짤 때, 설계를 잘해서 auctionProduct에 user._id를 넣어줬으면 populate로 간단하게 끝내는 방법입니다. (DB설계의 중요성)

 

그래서 지금은 어떤 코드를 쓰고 있나? equals를 사용했습니다!


equlas를 사용하니 newArray의 값들과 product._id의 타입을 맞춰주고 비교를 해주니까 간단(?)하게 해결이 됐습니다.

 

정리

DB설계의 중요성을 새삼 느끼게 되었고, mongoose를 이번에 처음 써보는 거라 100% 이해하지 못하고 사용하다 보니 부딪히는 일이 많이 생기더라고요. 너무 깊게는 아니어도 많이 쓰는 function만이라도 확실히 알고 넘어가야겠다는 생각이 들었습니다.
마지막으로 어메이징 javascript... 얼른 typescript가 더 익숙하게 연습을 많이 해봐야 할 것 같습니다.

 

 

반응형

'Back-end > DB' 카테고리의 다른 글

[Redis] Redis란 ?  (0) 2021.08.20
[MySQL]COALESCE  (0) 2021.05.06
[MySQL] like ('%',?,'%')  (0) 2021.03.19
[MySQL] group_concat  (0) 2021.03.01
[MySQL]이벤트스케줄러 생성 (Event Scheduler)  (0) 2021.03.01