MongoDB에서 find()와 findOne()의 차이점
MongoDB에서 데이터를 조회할 때 가장 많이 사용되는 두 메서드가 바로 find()와 findOne()입니다. 두 메서드는 비슷해 보이지만 반환 방식에서 중요한 차이가 있습니다.
findOne()은 쿼리 조건과 일치하는 첫 번째 문서(document)를 반환하며, 일치하는 문서가 하나도 없으면 null을 반환합니다.
반면 find() 메서드는 일치하는 문서가 없더라도 null을 반환하지 않습니다. 대신 항상 커서(cursor) 객체를 반환합니다. 이 커서를 통해 결과 문서들을 순회(iterate)하며 접근할 수 있습니다.
예제로 확인하기
실제 예제를 통해 두 메서드의 동작 차이를 살펴보겠습니다. 먼저 빈 컬렉션(emptyCollection)을 생성합니다.
> db.createCollection('emptyCollection');
{ "ok" : 1 }생성된 컬렉션에 문서가 몇 개 있는지 개수를 확인해 보겠습니다.
> db.emptyCollection.count();
실행 결과는 다음과 같습니다.
0
위 결과에서 알 수 있듯이 해당 컬렉션에는 아무 문서도 존재하지 않습니다. 이 상태에서 두 메서드가 각각 어떤 값을 반환하는지 테스트해 보겠습니다.
findOne() 동작 확인
다음 쿼리로 findOne()의 반환 결과를 확인할 수 있습니다.
> if(db.emptyCollection.findOne()){print("Returns Cursor")} else {print("Not returning cursor")}실행 결과:
Not returning cursor
컬렉션이 비어 있어 findOne()은 null을 반환했기 때문에 if 조건문이 거짓으로 평가되었습니다.
find() 동작 확인
이번에는 find() 메서드로 같은 조건을 테스트해 보겠습니다.
> if(db.emptyCollection.find()){print("Returns Cursor")} else {print("Not returning cursor")}실행 결과:
Returns Cursor
결과 문서가 없음에도 불구하고 find()는 null이 아닌 커서 객체를 반환하기 때문에 if 조건문이 참으로 평가되었습니다.
정리
두 메서드의 차이를 요약하면 다음과 같습니다.
- findOne(): 조건에 일치하는 첫 번째 문서를 반환하며, 일치하는 문서가 없으면
null반환 - find(): 일치 여부와 관계없이 항상 커서(cursor)를 반환하며,
null을 반환하지 않음
따라서 단일 문서 조회 시에는 findOne(), 여러 문서를 순회하며 처리해야 할 때는 find()를 사용하는 것이 적합합니다. 특히 조건문이나 null 체크 로직을 작성할 때는 두 메서드의 반환 값 차이를 반드시 고려해야 합니다.