mongoose를 사용하다 보면 너무나 많은 CRUD 조회 방법들이 존재하는 것을 알 수 있다. 이 중 자주 사용하는 find, deletMany등은 쉽게 생각이 나지만, 여전히 헷갈려서 구글링 하는 query들이 많이 존재한다.
(명색이 기억력 향상을 위한 글이므로 그냥 📝기록해놓자📝)
Model.deleteMany() Model.deleteOne() Model.find() Model.findById() Model.findByIdAndDelete() Model.findByIdAndRemove() Model.findByIdAndUpdate() Model.findOne() Model.findOneAndDelete() Model.findOneAndRemove() Model.findOneAndReplace() Model.findOneAndUpdate()
공식 문서에 따르면 더 많은 조회 방법이 등장하지만, 그 중 자주 사용하는 것들과 헷갈렸던 것들만 정리해 보려고 한다.
(세세하게 많은건 좋은데 타이핑하기 넘 힘들잖...)
model.deleteMany({})
너무나도 간단하게 사용할 수 있다. 모든 데이터베이스를 삭제할 수 있다. 예전에
model.deleteMany()
라고만 입력했다가 왜 삭제가 안될까... 했던 기억이 있는데, 중괄호를 꼭 붙여줘야 한다. 그리고 모든 데이터베이스가 삭제되므로 항상 신중하게 사용하도록 하자.
model.deleteOne({})
조건에 매칭되는 하나의 데이터베이스를 삭제한다.
model.deleteOne({"email" : "test@gmail.com"})
조건에 해당하는 유저를 삭제하고 싶을 때 위와 같이 사용할 수 있다.
model.find()
모든 데이터베이스를 조회할 수 있다. 너무나도 간단하므로 넘어가버리기
(중괄호는 필요하지 않다.)
사실 findById를 사용하는 영상이나 코드가 너무나 희귀한 것 같다. id는 어떤 model에서도 unique하기 때문에 이를 통해 조회하는 것이 가만히 보면 좋은 것 같으면서도 findOne시리즈는 다른 데이터들을 통해서도 조회할 수 있기 때문에 좀 더 활용성이 큰 느낌이 들고 이러한 이유로 더 많이 사용하는 것 같다는 생각이 든다.!?
(findOne시리즈로 넘어가기 위한 빌드업)
const user = model.findOne({"email" : "test@gmail.com"})
deleteOne과 같이 조건에 매칭되는 데이터베이스를 찾을 수 있다.
구글링 결과 타당한 이유가 없다면 findOneAndDelete를 사용하라고 한다. findOneAndRemove가 mongoDB에서는 findAndModify메소드가 된다는 점에서 약간 다르다고 하지만, mongoDB 3.2버전부터 Remove가 Delete로 대체된 것도 그렇고, 그냥 mongoDB는 remove를 별로 안좋아하는 느낌이 든다. 그러므로 대세에 따르도록 하자.
model.findOneAndDelete({"email" : "test@gmail.com"})
조건에 해당하는 데이터베이스를 삭제시킨다. deleteOne과 굉장히 비슷하지만, deleteOne은 어떠한 순서로 들어가 있는지 모르는 상태에서 하나를 삭제시키고, findOneAndDelete는 원하는 곳에서 하나를 찾아서 지울 수 있다고 한다. 따라서 보통의 경우 findOneAndDelete를 사용하는 것이 좋다고 한다.
(역시나 대세에 따르는 걸로)
비슷한 맥락이지만 단순하게 replace와 update의 의미대로 사용 가능하다.
{ "_id" : 1, "name" : "test", "age" : 14 }
위와 같은 데이터베이스에 대하여
model.findOneAndReplace(
{ "name" : "test" },
{ "age" : 27 }
)
{ "_id" : 1, "age" : 27 }
model.findOneAndUpdate(
{ "name" : "test" },
{ $set : { "age" : 27 } }
)
{ "_id" : 1, "name" : "test", "age" : 27 }
이를 통해 replace는 모든 데이터가 대체되지만, update는 해당 데이터만 업데이트 되는 결과를 볼 수 있다. 또한 findOneAndUpdate사용 시 두 번째 매개변수인 $set을 설정해주지 않으면
the update operation document must contain atomic operators
이라는 기분좋은 에러를 볼 수 있다.