복붙노트

[MONGODB] MongoDB를 : 그것은 대소 문자를 구분하지 쿼리를 만들 수 있습니까?

MONGODB

MongoDB를 : 그것은 대소 문자를 구분하지 쿼리를 만들 수 있습니까?

예:

> db.stuff.save({"foo":"bar"});

> db.stuff.find({"foo":"bar"}).count();
1
> db.stuff.find({"foo":"BAR"}).count();
0

해결법

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

    1.당신은 정규 표현식을 사용할 수 있습니다.

    당신은 정규 표현식을 사용할 수 있습니다.

    당신의 예에서 그는 다음과 같습니다

    db.stuff.find( { foo: /^bar$/i } );
    

    어쩌면 당신은 추가 비용 매번를 침해보다는있는 방법에 단지와 downcase (또는 upcase) 값은 당신이 그것을 찾을 수있는,하지만, 말을해야합니다. 분명히 사람의 이름과 태그 등 등,하지만 어쩌면 사용 사례에 대해이 늘 작동합니다.

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

    2.최신 정보:

    최신 정보:

    원래의 대답은 지금은 사용되지 않습니다. MongoDB를 지금 많은 기능을 가진 고급 전체 텍스트 검색을 지원합니다.

    ORIGINAL 답변 :

    정규식의 경우를 구분하여 검색 / 내가 큰 데이터 세트에 대한 쿼리 시간이 오래 걸릴 수 있습니다 MongoDB를이 인덱스를 검색 할 수 없음을 의미합니다 주목해야한다.

    비록 작은 데이터 세트와 함께, 그것은 매우 효율적이 아니다. 당신은 당신이 규모를 달성하기 위해 시도하는 경우에 문제가 될 수있는 쿼리 보증,보다 훨씬 더 큰 CPU의 타격을.

    다른 방법으로, 당신은 대문자 사본을 저장하고 그에 대해 검색 할 수 있습니다. 예를 들어, 나는 혼합 된 경우와 사용자 이름이있는 사용자 테이블을 가지고 있지만 ID는 사용자 이름의 대문자 사본입니다. 이 수 있도록 보장 대소 문자를 구분 중복 불가능 (모두 "foo"와 "Foo"허용되지 않습니다를 가짐), 그리고 나는 이름의 대소 문자를 구분 검색을 얻기 위해 ID = username.toUpperCase ()으로 검색 할 수 있습니다.

    당신의 분야가 큰 경우, 이러한 메시지의 본문으로 데이터를 복제하는 것은 아마 좋은 옵션이 아닙니다. 아파치 루씬 같은 외부 인덱서를 사용하는 경우의 최선의 방법입니다 생각합니다.

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

    3.앞의 예 있음을 알아 두셔야합니다 :

    앞의 예 있음을 알아 두셔야합니다 :

    db.stuff.find( { foo: /bar/i } );
    

    쿼리 (BAR1, barxyz, openbar)와 일치하는 줄을 포함하는 모든 항목의 원인이됩니다, 그것은 인증 기능에 사용자 이름 검색을위한 매우 위험 할 수 ...

    당신은 적절한 정규 표현식 구문 등을 사용하여 만 검색어와 일치해야 할 수도 있습니다 :

    db.stuff.find( { foo: /^bar$/i } );
    

    정규 표현식에 대한 구문 도움을 http://www.regular-expressions.info/를 참조하십시오

  4. ==============================

    4.당신이 변수에서 정규 표현식을 작성해야하는 경우,이 그것을 할 수있는 더 나은 방법은 다음과 같습니다 https://stackoverflow.com/a/10728069/309514

    당신이 변수에서 정규 표현식을 작성해야하는 경우,이 그것을 할 수있는 더 나은 방법은 다음과 같습니다 https://stackoverflow.com/a/10728069/309514

    당신은 다음과 같은 작업을 수행 할 수 있습니다 :

    var string = "SomeStringToFind";
    var regex = new RegExp(["^", string, "$"].join(""), "i");
    // Creates a regex of: /^SomeStringToFind$/i
    db.stuff.find( { foo: regex } );
    

    이 혜택이 더 프로그래밍되는 수 또는 당신이 그것을 많이 재사용하는 경우는 사전에이를 컴파일하여 성능 향상을 얻을 수있다.

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

    5.MongoDB를 3.4 빠른 대소 문자를 구분 검색을 수행하려면 권장되는 방법을 시작하는 것은 대소 문자를 구분하지 인덱스를 사용하는 것입니다.

    MongoDB를 3.4 빠른 대소 문자를 구분 검색을 수행하려면 권장되는 방법을 시작하는 것은 대소 문자를 구분하지 인덱스를 사용하는 것입니다.

    나는 개인적으로이 작업을 얻을 수 기쁘게 창시자의 한 이메일, 그는 그것이 일어날했다! 그것은 2009 JIRA에 문제가 있었고, 많은 기능을 요청했습니다. 여기 그것이 작동하는 방법 :

    소문자를 구분하지 않는 인덱스는 당신이 같은 대소 문자를 구분하지 인덱스를 만들 수 있습니다 1 또는 2의 힘으로 데이터 정렬을 지정하여 이루어집니다

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

    당신이 그들을 만들 때 당신은 또한 콜렉션 당 기본 데이터 정렬을 지정할 수 있습니다 :

    db.createCollection('cities', { collation: { locale: 'en', strength: 2 } } );
    

    두 경우 모두 대소 문자를 구별 인덱스를 사용하기 위해, 당신은 인덱스 또는 컬렉션을 만들 때 사용 된 찾기 작업에서 동일한 데이터 정렬을 지정해야합니다 :

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

    이것은 "뉴욕", "뉴욕", "뉴욕"을 반환 등

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

    6.

    db.zipcodes.find({city : "NEW YORK"}); // Case-sensitive
    db.zipcodes.find({city : /NEW york/i}); // Note the 'i' flag for case-insensitivity
    
  7. ==============================

    7.TL; DR

    TL; DR

    사용 정규식은하지 마십시오

    자연 그리고 사용하여 MongoDB의 붙박이 색인을 이동, 검색

    db.articles.insert(
       [
         { _id: 1, subject: "coffee", author: "xyz", views: 50 },
         { _id: 2, subject: "Coffee Shopping", author: "efg", views: 5 },
         { _id: 3, subject: "Baking a cake", author: "abc", views: 90  },
         { _id: 4, subject: "baking", author: "xyz", views: 100 },
         { _id: 5, subject: "Café Con Leche", author: "abc", views: 200 },
         { _id: 6, subject: "Сырники", author: "jkl", views: 80 },
         { _id: 7, subject: "coffee and cream", author: "efg", views: 10 },
         { _id: 8, subject: "Cafe con Leche", author: "xyz", views: 10 }
       ]
    )
    

    인덱싱 쿼리가 매우 느려질 수없이 필요는 검색하려는 중 텍스트 필드에 인덱스를 만들 수 있습니다

    db.articles.createIndex( { subject: "text" } )
    
    db.articles.find( { $text: { $search: "coffee",$caseSensitive :true } } )  //FOR SENSITIVITY
    db.articles.find( { $text: { $search: "coffee",$caseSensitive :false } } ) //FOR INSENSITIVITY
    
  8. ==============================

    8.

    db.company_profile.find({ "companyName" : { "$regex" : "Nilesh" , "$options" : "i"}});
    
  9. ==============================

    9.몽고 (현재 버전 2.0.0) 인덱스 필드에 대한 대소 문자 구분 검색을 허용하지 않습니다 - 자신의 설명서를 참조하십시오. 비 인덱스 필드의 경우, 다른 답변에 나와있는 정규 표현식에 잘해야한다.

    몽고 (현재 버전 2.0.0) 인덱스 필드에 대한 대소 문자 구분 검색을 허용하지 않습니다 - 자신의 설명서를 참조하십시오. 비 인덱스 필드의 경우, 다른 답변에 나와있는 정규 표현식에 잘해야한다.

  10. ==============================

    10.가장 좋은 방법은 당신의 객체 모델 래퍼를 만들 때, 당신이 그에도 색인 검색됩니다 필드 세트를 통해 저장 () 방법으로 반복이 선택의 언어입니다; 필드의 그 세트는 다음 검색에 사용되는 소문자 대응이 있어야합니다.

    가장 좋은 방법은 당신의 객체 모델 래퍼를 만들 때, 당신이 그에도 색인 검색됩니다 필드 세트를 통해 저장 () 방법으로 반복이 선택의 언어입니다; 필드의 그 세트는 다음 검색에 사용되는 소문자 대응이 있어야합니다.

    객체가 다시 저장 될 때마다, 소문자 속성은 확인하고 주요 속성에 대한 변경 사항으로 업데이트됩니다. 효율적으로 검색,하지만 LC 때마다 필드 업데이트하는 데 필요한 추가 작업을 숨길 수 있도록이 그것을 만들 것입니다.

    접두어 인 LC_로 값 객체 저장소하거나 필드 이름 : 낮은 경우 필드는 열쇠가 될 수 있습니다. 나는 단순화 쿼리 (깊은 개체 쿼리가 시간에 혼동을 줄 수) 두 번째 하나를 사용하십시오.

    참고 : LC_ 필드가 아닌 그들이의 기반으로하고있는 주요 분야 인덱스합니다.

  11. ==============================

    11.당신이 "표"에서 "열"을 검색 할 당신은 대소 문자를 구분 검색을한다고 가정. 가장 효율적인 방법은 다음과 같다;

    당신이 "표"에서 "열"을 검색 할 당신은 대소 문자를 구분 검색을한다고 가정. 가장 효율적인 방법은 다음과 같다;

    //create empty JSON Object
    mycolumn = {};
    
    //check if column has valid value
    if(column) {
        mycolumn.column = {$regex: new RegExp(column), $options: "i"};
    }
    Table.find(mycolumn);
    

    위의 코드는 "I"옵션으로 설정 문자를 구별 기준에 정규식 및 검색 등의 검색 값을 추가합니다.

    모두 제일 좋다.

  12. ==============================

    12.당신이 로그인 시스템에 대해이 작업을 수행 할 때 검색중인 모든 단일 문자를 탈출하고 ^ 및 $ 사업자 잊지 마세요 - 정규식 기반 쿼리를 사용할 때 한 가지 유념해야 할 매우 중요한 것. Lodash는 이것에 대한 좋은 기능을 가지고 당신은 이미 그것을 사용한다 :

    당신이 로그인 시스템에 대해이 작업을 수행 할 때 검색중인 모든 단일 문자를 탈출하고 ^ 및 $ 사업자 잊지 마세요 - 정규식 기반 쿼리를 사용할 때 한 가지 유념해야 할 매우 중요한 것. Lodash는 이것에 대한 좋은 기능을 가지고 당신은 이미 그것을 사용한다 :

    db.stuff.find({$regex: new RegExp(_.escapeRegExp(bar), $options: 'i'})
    

    왜? 사용자 유입을 상상해 보라. * 자신의 이름으로. 그건 그냥 사용자의 암호를 추측하여 로그인을 가능하게하는 모든 사용자 이름을 일치합니다.

  13. ==============================

    13.이것은 나를 위해 일한 몽구스를 사용 :

    이것은 나를 위해 일한 몽구스를 사용 :

    var find = function(username, next){
        User.find({'username': {$regex: new RegExp('^' + username, 'i')}}, function(err, res){
            if(err) throw err;
            next(null, res);
        });
    }
    
  14. ==============================

    14.집계 프레임 워크는 MongoDB를 2.2에서 소개되었습니다. 당신은 문자열 사이의 대소 문자를 구분하지 않고 비교를 만들기 위해 문자열 연산자 "$ strcasecmp"를 사용할 수 있습니다. 그것은 이상 권장 및 정규식을 사용하는 것보다 쉽다.

    집계 프레임 워크는 MongoDB를 2.2에서 소개되었습니다. 당신은 문자열 사이의 대소 문자를 구분하지 않고 비교를 만들기 위해 문자열 연산자 "$ strcasecmp"를 사용할 수 있습니다. 그것은 이상 권장 및 정규식을 사용하는 것보다 쉽다.

    https://docs.mongodb.com/manual/reference/operator/aggregation/strcasecmp/#exp._S_strcasecmp 다음은 집계 명령 연산자에 대한 공식 문서입니다.

  15. ==============================

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

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

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

    /* 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
    
  16. ==============================

    16.변수를 검색하고 탈출을 위해 :

    변수를 검색하고 탈출을 위해 :

    const escapeStringRegexp = require('escape-string-regexp')
    const name = 'foo'
    db.stuff.find({name: new RegExp('^' + escapeStringRegexp(name) + '$', 'i')})   
    

    변수를 탈출하기로 공격에 대한 쿼리를 보호한다 '. *'등 정규 표현식.

    이스케이프 문자열 정규 표현식

  17. ==============================

    17.나는 내 필터에서 사용하는 대소 문자 구분 정규식에 대한 간단한 Func을을 만들었습니다.

    나는 내 필터에서 사용하는 대소 문자 구분 정규식에 대한 간단한 Func을을 만들었습니다.

    private Func<string, BsonRegularExpression> CaseInsensitiveCompare = (field) => 
                BsonRegularExpression.Create(new Regex(field, RegexOptions.IgnoreCase));
    

    다음과 같이 그럼 당신은 단순히 필드를 필터링 할 수 있습니다.

    db.stuff.find({"foo": CaseInsensitiveCompare("bar")}).count();
    
  18. ==============================

    18.필터를 사용하여 C #으로 나를 위해 작동합니다.

    필터를 사용하여 C #으로 나를 위해 작동합니다.

    string s = "searchTerm";
        var filter = Builders<Model>.Filter.Where(p => p.Title.ToLower().Contains(s.ToLower()));
                    var listSorted = collection.Find(filter).ToList();
                    var list = collection.Find(filter).ToList();
    

    나는 수익이 발생하지만 난 아직이 밖으로 테스트를하지 않은 후 방법이라고 생각하기 때문에 심지어 인덱스를 사용할 수 있습니다.

    이것은 또한의 문제를 피할 수

    var filter = Builders<Model>.Filter.Eq(p => p.Title.ToLower(), s.ToLower());
    

    그 MongoDB를이 p.Title.ToLower 생각한다 () 속성이 제대로지도하지 않습니다.

  19. ==============================

    19.MongoDB를하고 산화 마그네슘 godoc globalsign 라이브러리와 대소 문자를 구분 전체 텍스트 검색을 할 수 Golang 및 소원을 사용하는 하나의하십시오.

    MongoDB를하고 산화 마그네슘 godoc globalsign 라이브러리와 대소 문자를 구분 전체 텍스트 검색을 할 수 Golang 및 소원을 사용하는 하나의하십시오.

    collation := &mgo.Collation{
        Locale:   "en",
        Strength: 2, 
    }
    
    
    err := collection.Find(query).Collation(collation)
    
  20. ==============================

    20.사용 정규식은 당신을 위해 작동하지 않는 다른 옵션의 경우, 정규식은 좋은 옵션입니다. 그것은 문자열의 경우를 구분한다.

    사용 정규식은 당신을 위해 작동하지 않는 다른 옵션의 경우, 정규식은 좋은 옵션입니다. 그것은 문자열의 경우를 구분한다.

    var username = new RegExp("^" + "John" + "$", "i");;
    

    쿼리에서 사용자 이름을 사용하고 그 수행.

    내가 너무 당신을 위해 작동 바랍니다. 모두 제일 좋다.

  21. ==============================

    21.당신은 몽고 문서에서 볼 수 있듯이 - 버전 3.2 $ 텍스트 인덱스는 기본적으로 대소 문자를 구분하기 때문에 : https://docs.mongodb.com/manual/core/index-text/#text-index-case-insensitivity

    당신은 몽고 문서에서 볼 수 있듯이 - 버전 3.2 $ 텍스트 인덱스는 기본적으로 대소 문자를 구분하기 때문에 : https://docs.mongodb.com/manual/core/index-text/#text-index-case-insensitivity

    텍스트 인덱스를 생성하고 쿼리에서 $ 텍스트 연산자를 사용합니다.

  22. ==============================

    22.이러한 문자열 검색을 위해 테스트되었습니다

    이러한 문자열 검색을 위해 테스트되었습니다

    {'_id': /.*CM.*/}               ||find _id where _id contains   ->CM
    {'_id': /^CM/}                  ||find _id where _id starts     ->CM
    {'_id': /CM$/}                  ||find _id where _id ends       ->CM
    
    {'_id': /.*UcM075237.*/i}       ||find _id where _id contains   ->UcM075237, ignore upper/lower case
    {'_id': /^UcM075237/i}          ||find _id where _id starts     ->UcM075237, ignore upper/lower case
    {'_id': /UcM075237$/i}          ||find _id where _id ends       ->UcM075237, ignore upper/lower case
    
  23. ==============================

    23.나는 비슷한 문제에 직면했고이 나를 위해 일 것입니다 :

    나는 비슷한 문제에 직면했고이 나를 위해 일 것입니다 :

      const flavorExists = await Flavors.findOne({
        'flavor.name': { $regex: flavorName, $options: 'i' },
      });
    
  24. from https://stackoverflow.com/questions/1863399/mongodb-is-it-possible-to-make-a-case-insensitive-query by cc-by-sa and MIT license