[regex] Mongodb에서 대소 문자를 구분하지 않는 쿼리를 작성하려면 어떻게해야합니까?

var thename = 'Andrew';
db.collection.find({'name':thename});

대소 문자를 구분하지 않는 쿼리는 어떻게합니까? “andrew”라고해도 결과를 찾고 싶습니다.



답변

Chris Fulstow의 솔루션은 작동하지만 (+1), 특히 컬렉션이 매우 큰 경우 효율적이지 않을 수 있습니다. 루트가 아닌 정규 표현식 (로 시작하지 않는 ^정규 표현식, 문자열의 시작 부분에 정규 표현식을 고정 함) 및 i대소 문자를 구분하지 않는 플래그를 사용하는 정규 표현식 은 존재하더라도 색인을 사용하지 않습니다.

고려할 수있는 다른 옵션은 name필드 의 소문자 버전을 저장하기 위해 데이터를 비정규 화하는 것 입니다 (예 : name_lower. 그런 다음 다음과 같이 대소 문자를 구분하지 않는 정확한 일치에 대해 효율적으로 (특히 색인화 된 경우) 쿼리 할 수 ​​있습니다.

db.collection.find({"name_lower": thename.toLowerCase()})

또는 다음과 같이 접두사 일치 (루팅 된 정규식)를 사용합니다.

db.collection.find( {"name_lower":
    { $regex: new RegExp("^" + thename.toLowerCase(), "i") } }
);

이 두 쿼리는 모두에 인덱스를 사용합니다 name_lower.


답변

이 경우 대소 문자를 구분하지 않는 정규식 을 사용해야합니다 . 예 :

db.collection.find( { "name" : { $regex : /Andrew/i } } );

thename변수 에서 정규식 패턴을 사용하려면 새 RegExp 개체를 생성 합니다.

var thename = "Andrew";
db.collection.find( { "name" : { $regex : new RegExp(thename, "i") } } );

업데이트 : 정확히 일치하려면 regex를 사용해야합니다 "name": /^Andrew$/i. Yannick L.


답변

나는 이것을 이렇게 해결했다.

 var thename = 'Andrew';
 db.collection.find({'name': {'$regex': thename,$options:'i'}});

‘대소 문자를 구분하지 않는 정확히 일치’에 대해 쿼리하려면 다음과 같이 갈 수 있습니다.

var thename =  '^Andrew$';
db.collection.find({'name': {'$regex': thename,$options:'i'}});


답변

이제 MongoDB 3.4에는 대소 문자를 구분하지 않는 진정한 인덱스를 만드는 기능이 포함되어있어 대규모 데이터 세트에서 대소 문자를 구분하지 않는 조회 속도를 크게 높일 수 있습니다. 강도가 2 인 데이터 정렬을 지정하여 만들어집니다.

아마도 가장 쉬운 방법은 데이터베이스에 데이터 정렬을 설정하는 것입니다. 그런 다음 모든 쿼리가 해당 데이터 정렬을 상속하고이를 사용합니다.

db.createCollection("cities", { collation: { locale: 'en_US', strength: 2 } } )
db.names.createIndex( { city: 1 } ) // inherits the default collation

다음과 같이 할 수도 있습니다.

db.myCollection.createIndex({city: 1}, {collation: {locale: "en", strength: 2}});

다음과 같이 사용하십시오.

db.myCollection.find({city: "new york"}).collation({locale: "en", strength: 2});

이렇게하면 ‘뉴욕’, ‘뉴욕’, ‘뉴욕’등의 도시가 반환됩니다.

자세한 정보 : https://jira.mongodb.org/browse/SERVER-90


답변

  1. Mongoose (및 Node)를 사용하면 다음과 같이 작동했습니다.

    • User.find({ email: /^name@company.com$/i })

    • User.find({ email: new RegExp(`^ $ {emailVariable} $`, ‘i’)})

  2. MongoDB에서는 다음과 같이 작동했습니다.

    • db.users.find({ email: { $regex: /^name@company.com$/i }})

두 줄은 모두 대소 문자를 구분하지 않습니다. DB의 이메일이 될 수 NaMe@CompanY.Com있으며 두 줄 모두 DB에서 개체를 찾습니다.

마찬가지로, 우리 는 DB에서 /^NaMe@CompanY.Com$/i이메일을 사용할 수 있습니다 name@company.com.


답변

대소 문자를 구분하지 않는 문자열을 찾으려면 이것을 사용하십시오.

var thename = "Andrew";
db.collection.find({"name":/^thename$/i})


답변

이 문제를 몇 시간 전에 해결했습니다.

var thename = 'Andrew'
db.collection.find({ $text: { $search: thename } });
  • 이러한 방식으로 쿼리를 수행 할 때 대소 문자 구분 및 분음 부호 구분은 기본적으로 false로 설정됩니다.

다음과 같은 방법으로 Andrew의 사용자 개체에서 필요한 필드를 선택하여이를 확장 할 수도 있습니다.

db.collection.find({ $text: { $search: thename } }).select('age height weight');

참조 : https://docs.mongodb.org/manual/reference/operator/query/text/#text