MongoDB Robomongo에서 collation이 함수로 인식되지 않는 이유
db.data.find(…).collation is not a function 오류가 발생하는 가장 일반적인 원인은 collation 기능이 MongoDB 3.4 버전부터 도입되었기 때문입니다. 즉, 사용 중인 MongoDB가 3.4 미만의 구버전이라면 collation 메서드를 호출할 수 없어 위와 같은 오류가 나타납니다.
이 글에서는 MongoDB 4.0.5 버전을 기준으로 설명합니다. 먼저 시스템에 설치된 현재 MongoDB 버전을 확인하는 방법부터 살펴보겠습니다.
1. 현재 MongoDB 버전 확인하기
아래 쿼리를 실행하면 현재 시스템에 설치된 MongoDB 버전을 확인할 수 있습니다.
> db.version()
실행 결과는 다음과 같습니다.
4.0.5
2. 컬렉션 생성 및 인덱스에 collation 적용하기
먼저 문서를 담을 컬렉션을 생성하면서 collation 옵션이 적용된 인덱스를 만들어 보겠습니다.
> db.collationExample.createIndex({Value: 1}, {collation: {locale: "en", strength: 1}});
{
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}여기서 locale: "en"은 영어 로케일을, strength: 1은 대소문자를 구분하지 않는 비교 수준을 의미합니다.
3. 테스트용 문서 삽입하기
대소문자와 악센트 문자가 섞인 여러 문서를 삽입해 보겠습니다.
> db.collationExample.insertOne({'Value':'x'});
{ "acknowledged" : true, "insertedId" : ObjectId("5e038a3cf5e889d7a51994f5") }
> db.collationExample.insertOne({'Value':'X'});
{ "acknowledged" : true, "insertedId" : ObjectId("5e038a48f5e889d7a51994f6") }
> db.collationExample.insertOne({'Value':'Y'});
{ "acknowledged" : true, "insertedId" : ObjectId("5e038a49f5e889d7a51994f7") }
> db.collationExample.insertOne({'Value':'a'});
{ "acknowledged" : true, "insertedId" : ObjectId("5e038a49f5e889d7a51994f8") }
> db.collationExample.insertOne({'Value':'á'});
{ "acknowledged" : true, "insertedId" : ObjectId("5e038a4bf5e889d7a51994f9") }4. 저장된 전체 문서 조회하기
find() 메서드를 사용해 컬렉션의 모든 문서를 출력해 보겠습니다.
> db.collationExample.find().pretty();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e038a3cf5e889d7a51994f5"), "Value" : "x" }
{ "_id" : ObjectId("5e038a48f5e889d7a51994f6"), "Value" : "X" }
{ "_id" : ObjectId("5e038a49f5e889d7a51994f7"), "Value" : "Y" }
{ "_id" : ObjectId("5e038a49f5e889d7a51994f8"), "Value" : "a" }
{ "_id" : ObjectId("5e038a4bf5e889d7a51994f9"), "Value" : "á" }5. collation() 메서드로 대소문자 무시하고 검색하기
이제 collation() 메서드를 활용한 검색 쿼리입니다.
> db.collationExample.find({ Value: "a" } ).collation( { locale: "en", strength: 1 } );strength 값이 1로 설정되어 있기 때문에 대소문자 및 악센트 차이가 무시됩니다. 따라서 'a'로 검색했음에도 'á'까지 함께 조회되는 것을 확인할 수 있습니다.
{ "_id" : ObjectId("5e038a49f5e889d7a51994f8"), "Value" : "a" }
{ "_id" : ObjectId("5e038a4bf5e889d7a51994f9"), "Value" : "á" }정리
'collation is not a function' 오류는 대부분 MongoDB 버전이 3.4 미만일 때 발생합니다. Robomongo(현재의 Studio 3T) 자체의 문제라기보다는 연결된 MongoDB 서버 버전을 먼저 확인하는 것이 중요합니다. db.version() 명령으로 버전을 점검한 후, 필요하다면 MongoDB를 3.4 이상으로 업그레이드하면 오류 없이 collation 기능을 정상적으로 사용할 수 있습니다.