Mongodb Objectid값과 String 일치연산자로 비교하기

onezerokang·2021년 6월 16일
0
post-thumbnail

오늘 회사에서 개발을 하면서 다음과 같은 코드를 짜야 할 일이 생겼다.

  1. 내가 나의 개인페이지에 접근하면 팔로우 버튼과 DM버튼 제거
  2. 남이 내 페이지에 들어오면 팔로우 버튼과 DM버튼 존재

이걸 처리하기 위해서 현재 페이지의 id 값을 req.params.id로 가져왔고,
현재 유저의 정보를 const user = await User.findOne()로 가져왔다. 그리고 다음과 같이 비교했다.

const pageId = req.params.id;
const userId = await User.findOne({email})._id;

const isPageOwner = pageId === userId;
//두 값이 같더라도 일치하지 않음

위 코드처럼 현재 pageId와 userId를 비교했는데 값이 같음에도 false가 나왔다.(참고로 pageId가 user의 ObjectId와 값이 같다)

그래서 typeof로 타입을 확인해봤다.

const pageId = req.params.id;
const userId = await User.findOne({email})._id;

console.log(typeof pageId); //String
console.log(typeof userId); //Object

그렇다. pageId는 req.params로 가져왔기 때문에 String이지만, userId는 mongodb에서 쿼리하여 가져왔기 때문에 mongodb의 primary key인 ObjectId였던 것이다. 그래서 이를 어떻게 처리할 지 공부한 결과 다음과 같이 작성하여 해결했다.

const pageId = req.params.id;
const userId = await User.findOne({email})._id;

const isShopOwner = userId.equals(pageId); //값이 같으면 true를 return 한다.

그렇다면 이 equals는 무엇일까? equals는 필드 값이 특정 값과 일치하는지, 혹은 일치하지 않는지 비교하고 boolean을 반환한다. 그래서 userId가 ObjectId임에도 같은 값인지 검사할 수 있는 것이다. 단 ObjectId에만 적용된다.

출처
https://mongoosejs.com/docs/api.html#document_Document-equals

profile
블로그 이전 했습니다: https://techpedia.tistory.com

0개의 댓글