복붙노트

[MONGODB] 어떻게하여 MongoDB에 대소 문자를 구분하지 쿼리를해야합니까?

MONGODB

어떻게하여 MongoDB에 대소 문자를 구분하지 쿼리를해야합니까?

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

어떻게 쿼리의 경우를 구분합니까? 난 "앤드류"경우 결과를 찾으려면,

해결법

  1. ==============================

    1.크리스 Fulstow의 솔루션 의지 일 (일)은, 그러나, 당신의 수집이 매우 큰 특히 효율적하지 않을 수 있습니다. 그들이 존재하는 경우에도 인덱스를 사용하지 않습니다 소문자 구분에 대한 I 플래그를 사용하는, (그 어떤 앵커 문자열의 시작에 정규 표현식 ^로 시작되지 않음) 정규 표현식을 비는 뿌리.

    크리스 Fulstow의 솔루션 의지 일 (일)은, 그러나, 당신의 수집이 매우 큰 특히 효율적하지 않을 수 있습니다. 그들이 존재하는 경우에도 인덱스를 사용하지 않습니다 소문자 구분에 대한 I 플래그를 사용하는, (그 어떤 앵커 문자열의 시작에 정규 표현식 ^로 시작되지 않음) 정규 표현식을 비는 뿌리.

    당신이 고려할 수있는 또 다른 옵션은 name_lower과 같은 예를 들어, 이름 필드의 소문자 버전을 저장하는 데이터를 비정규 화하는 것입니다. 할 수 있습니다 다음 쿼리 (이 인덱스 특히 경우)와 같은 대소 문자를 구별 정확히 일치를위한 효율적한다 :

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

    아니면 접두사 일치 (뿌리 정규 표현식)와 같은과 :

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

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

  2. ==============================

    2.당신은, 예를 들어,이 일을 위해 대소 문자를 구별하지 정규 표현식을 사용해야 할 것

    당신은, 예를 들어,이 일을 위해 대소 문자를 구별하지 정규 표현식을 사용해야 할 것

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

    당신의 thename 변수에서 정규 표현식 패턴을 사용하려면, 새로운 정규식 객체를 생성 :

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

    업데이트 : / ^ 앤드류 $ / I : 정확히 일치를 들어, 정규 표현식 "이름"을 사용해야합니다. 야닉 L. 덕분에

  3. ==============================

    3.나는 이런 식으로 해결했다.

    나는 이런 식으로 해결했다.

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

    당신은 '대소 문자를 구별하지가 정확히 일치'에서 조회하려는 경우, 당신은이 같이 갈 수 있습니다.

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

    4.MongoDB를 3.4 지금 dramtically 대규모 데이터 세트에 대한 사례를 구분 조회의 속도를 증가 진정한 대소 문자를 구별 인덱스를 만들 수있는 기능이 포함되어 있습니다. 그것은 2의 힘으로 데이터 정렬을 지정하여 이루어진다.

    MongoDB를 3.4 지금 dramtically 대규모 데이터 세트에 대한 사례를 구분 조회의 속도를 증가 진정한 대소 문자를 구별 인덱스를 만들 수있는 기능이 포함되어 있습니다. 그것은 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

  5. ==============================

    5.두 라인은 대소 문자를 구별하지 않는다. DB를에 이메일을 NaMe@CompanY.Com이 될 수 두 라인은 여전히 ​​DB에서 개체를 찾을 수 있습니다.

    두 라인은 대소 문자를 구별하지 않는다. DB를에 이메일을 NaMe@CompanY.Com이 될 수 두 라인은 여전히 ​​DB에서 개체를 찾을 수 있습니다.

    마찬가지로, 우리는 /^NaMe@CompanY.Com$/i를 사용할 수 있으며, 그것은 여전히 ​​이메일을 찾아 낼 것입니다 : DB에 name@company.com을.

  6. ==============================

    6.난 그냥 몇 시간 전에이 문제를 해결했다.

    난 그냥 몇 시간 전에이 문제를 해결했다.

    var thename = 'Andrew'
    db.collection.find({ $text: { $search: thename } });
    

    당신은 당신이이 방법을 수행하여 앤드류의 사용자 개체에서 필요한 필드를 선택하여이에 따라 확장 할 수 있습니다 :

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

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

  7. ==============================

    7.대소 문자를 구분 리터럴 문자열을 찾으려면 :

    대소 문자를 구분 리터럴 문자열을 찾으려면 :

    db.collection.find({
        name: {
            $regex: new RegExp('^' + name.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + '$', 'i')
        }
    });
    
    db.collection.find({
        name_lower: name.toLowerCase()
    });
    

    정규 표현식은 리터럴 문자열 매칭에 비해 느립니다. 그러나 추가 소문자 필드는 코드의 복잡성을 증가시킬 것이다. 의심에, 정규 표현식을 사용합니다. 그것은 당신의 분야, 즉, 당신이 첫번째 장소에있는 경우에 대한 상관 없어를 대체 할 수 있다면 난 단지 명시 적으로 소문자 필드를 사용하는 것이 좋습니다 것입니다.

    당신이 정규식하기 전에 이름을 탈출 할 필요가 있습니다. 당신은 사용자가 입력 와일드 카드를 원하는 경우에, .replace을 추가 선호 (/ % / g, '. *')는 'A'로 시작하는 모든 이름을 찾을 수의 "%"와 일치 할 수 있도록 탈출 후.

  8. ==============================

    8.대소 문자를 구분 문자열이 사용 찾으려면,

    대소 문자를 구분 문자열이 사용 찾으려면,

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

    9.다음 쿼리는 소문자를 구별하고 글로벌 발생에 필요한 문자열을 사용하여 문서를 찾을 수

    다음 쿼리는 소문자를 구별하고 글로벌 발생에 필요한 문자열을 사용하여 문서를 찾을 수

    db.collection.find({name:{
                                 $regex: new RegExp(thename, "ig")
                             }
                        },function(err, doc) {
                                             //Your code here...
                      });
    
  10. ==============================

    10.당신은 대소 문자를 구분 인덱스를 사용할 수 있습니다 :

    당신은 대소 문자를 구분 인덱스를 사용할 수 있습니다 :

    다음 예제없이 기본 데이터 정렬 된 컬렉션은, 다음의 경우를 구분 데이터 정렬로 이름 필드에 인덱스를 추가 생성합니다. 유니 코드에 대한 국제 구성 요소

    /*
    * strength: CollationStrength.Secondary
    * Secondary level of comparison. Collation performs comparisons up to secondary * differences, such as diacritics. That is, collation performs comparisons of 
    * base characters (primary differences) and diacritics (secondary differences). * Differences between base characters takes precedence over secondary 
    * differences.
    */
    db.users.createIndex( { name: 1 }, collation: { locale: 'tr', strength: 2 } } )
    

    인덱스를 사용하려면, 쿼리는 동일한 데이터 정렬을 지정해야합니다.

    db.users.insert( [ { name: "Oğuz" },
                                { name: "oğuz" },
                                { name: "OĞUZ" } ] )
    
    // does not use index, finds one result
    db.users.find( { name: "oğuz" } )
    
    // uses the index, finds three results
    db.users.find( { name: "oğuz" } ).collation( { locale: 'tr', strength: 2 } )
    
    // does not use the index, finds three results (different strength)
    db.users.find( { name: "oğuz" } ).collation( { locale: 'tr', strength: 1 } )
    

    또는 당신은 기본 데이터 정렬 된 컬렉션을 만들 수 있습니다 :

    db.createCollection("users", { collation: { locale: 'tr', strength: 2 } } )
    db.users.createIndex( { name : 1 } ) // inherits the default collation
    
  11. ==============================

    11.쉬운 방법은 다음과 같이 $ tolower를를 사용하는 것입니다.

    쉬운 방법은 다음과 같이 $ tolower를를 사용하는 것입니다.

    db.users.aggregate([
        {
            $project: {
                name: { $toLower: "$name" }
            }
        },
        {
            $match: {
                name: the_name_to_search
            }
        }
    ])
    
  12. from https://stackoverflow.com/questions/7101703/how-do-i-make-case-insensitive-queries-on-mongodb by cc-by-sa and MIT license