Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB Robomongo 'collation is not a function' 오류 해결 방법

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 기능을 정상적으로 사용할 수 있습니다.