복붙노트

[MONGODB] MongoDB를 및 C # : 대소 문자를 구분 검색

MONGODB

MongoDB를 및 C # : 대소 문자를 구분 검색

나는 MongoDB를하고 MongoDB를위한 C # 드라이버를 사용하고 있습니다.

나는 최근에 MongoDB의 모든 쿼리는 대소 문자를 구분 것을 발견했다. 어떻게 대소 문자 구분 검색을 할 수 있습니까?

나는이 작업을 수행하는 방법을 발견 :

Query.Matches(
    "FirstName", 
    BsonRegularExpression.Create(new Regex(searchKey,RegexOptions.IgnoreCase)));

해결법

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

    1.이를위한 가장 간단하고 안전한 방법은 Linq에를 사용하고 있습니다 :

    이를위한 가장 간단하고 안전한 방법은 Linq에를 사용하고 있습니다 :

    var names = namesCollection.AsQueryable().Where(name =>
        name.FirstName.ToLower().Contains("hamster"));
    

    튜토리얼 ToLower는에서 설명하고있는 바와 같이, ToLowerInvariant,의 ToUpper 및 ToUpperInvariant 모두가 대소 문자를 구분 방법으로 일치를 수행합니다. 포함 또는 StartsWith처럼 당신이 지원되는 모든 문자열 방법을 사용할 수 있습니다 후.

    이 예는 생성합니다 :

    {
        "FirstName" : /hamster/is
    }
    

    는 I 옵션은 경우를 구분한다.

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

    2.난 그냥 다른 제안들보다이 훨씬 간단을 구현했습니다. 이 질문의 나이에,이 기능은 한 번에 사용할 수 없었을 수 있습니다 때문에 그러나 나는 알고 있습니다.

    난 그냥 다른 제안들보다이 훨씬 간단을 구현했습니다. 이 질문의 나이에,이 기능은 한 번에 사용할 수 없었을 수 있습니다 때문에 그러나 나는 알고 있습니다.

    소문자 구분을 전달하기 위해 Bson 정규 표현식 생성자의 옵션을 사용합니다. 난 그냥 소스 코드를 살펴했고 그 '내가'당신이 필요로하는 모든 것입니다 발견했다. 예를 들어.

    var regexFilter = Regex.Escape(filter);
    var bsonRegex = new BsonRegularExpression(regexFilter, "i");
    
    Query.Matches("MyField", bsonRegex);
    

    당신은 검색을 위해 두 번 기록을 유지 할 필요가 없습니다.

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

    3.이 같은 것을 사용하려고 :

    이 같은 것을 사용하려고 :

    Query.Matches("FieldName", BsonRegularExpression.Create(new Regex(searchKey, RegexOptions.IgnoreCase)))
    
  4. ==============================

    4.당신은 아마 모두 소문자로 다시 그것의 진정한 가치와 함께 한 번, 두 번 필드를 저장하고해야합니다. 그런 다음 대소 문자를 구분 검색을위한 소문자 버전을 조회 할 수 있습니다 (또한 쿼리 문자열을 소문자로 잊지 마세요).

    당신은 아마 모두 소문자로 다시 그것의 진정한 가치와 함께 한 번, 두 번 필드를 저장하고해야합니다. 그런 다음 대소 문자를 구분 검색을위한 소문자 버전을 조회 할 수 있습니다 (또한 쿼리 문자열을 소문자로 잊지 마세요).

    이 방법은 작업 (또는 필요) 많은 데이터베이스 시스템을 위해, 그것은 (적어도 접두사 또는 정확한 매칭을위한) 정규 표현식 기반 기술보다 더 수행해야합니다.

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

    5.i3arnon 대답, 당신은 대소 문자를 구분 비교 / 검색을 수행 Queryable에서 사용할 수 있습니다. 내가 뭘 발견하는 것은 지원되지 않기 때문에 내가, string.Equals () 메소드를 사용하지 수 있었다. 당신은 비교를해야하는 경우, 불행하게도 꽤 많은 시간 동안, 해결책을 고민 저를 유지하는 적합하지 않을 것이다) (포함합니다.

    i3arnon 대답, 당신은 대소 문자를 구분 비교 / 검색을 수행 Queryable에서 사용할 수 있습니다. 내가 뭘 발견하는 것은 지원되지 않기 때문에 내가, string.Equals () 메소드를 사용하지 수 있었다. 당신은 비교를해야하는 경우, 불행하게도 꽤 많은 시간 동안, 해결책을 고민 저를 유지하는 적합하지 않을 것이다) (포함합니다.

    문자열 비교를하고 싶은 누군가를 위해, 단순히 .Equals 대신 == ()를 사용합니다.

    암호:

    var names = namesCollection.AsQueryable().Where(name =>
        name.FirstName.ToLower() == name.ToLower());
    
  6. ==============================

    6.경우 다른 사람에 애드온 유창 - 몽고를 사용하여, 궁금, 당신은 그런 쿼리에 Linq에 사용할 수 있습니다 :

    경우 다른 사람에 애드온 유창 - 몽고를 사용하여, 궁금, 당신은 그런 쿼리에 Linq에 사용할 수 있습니다 :

    public User FindByEmail(Email email)
    {
        return session.GetCollection<User>().AsQueryable()
               .Where(u => u.EmailAddress.ToLower() == email.Address.ToLower()).FirstOrDefault();
    }
    

    어떤 올바른 JS-쿼리의 결과. 불행하게도, String.Equals ()는 아직 지원되지 않습니다.

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

    7.또한 MongoDB를 필터에 내장 된있어 사용할 수 있습니다. 그것은 몽고의 몇 가지 방법을 사용하여보다 쉽게 ​​할 수 있습니다.

    또한 MongoDB를 필터에 내장 된있어 사용할 수 있습니다. 그것은 몽고의 몇 가지 방법을 사용하여보다 쉽게 ​​할 수 있습니다.

    var filter = Builders<Model>.Filter.Where(p => p.PropertyName.ToLower().Contains(s.ToLower()));
    var list = collection.Find(filter).Sort(mySort).ToList();
    
  8. ==============================

    8.아래와 같이 할 수있는 방법은 MongoDB.Bson.BsonJavaScript 클래스를 사용하는 것입니다

    아래와 같이 할 수있는 방법은 MongoDB.Bson.BsonJavaScript 클래스를 사용하는 것입니다

     store.FindAs<Property>(Query.Where(BsonJavaScript.Create(string.Format("this.City.toLowerCase().indexOf('{0}') >= 0", filter.City.ToLower()))));
    
  9. ==============================

    9.MongoDB를 들어 3.4 이상 권장되는 방법은 인덱스를 사용하는 것입니다. https://jira.mongodb.org/browse/DOCS-11105?focusedCommentId=1859745&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-1859745 참조

    MongoDB를 들어 3.4 이상 권장되는 방법은 인덱스를 사용하는 것입니다. https://jira.mongodb.org/browse/DOCS-11105?focusedCommentId=1859745&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-1859745 참조

    나는 성공적 사례를 구분하여 함께 검색하고 있습니다 : 및 자세한 내용은 1 또는 2를 참조 https://docs.mongodb.com/manual/core/index-case-insensitive/의 힘 : 1. ( "EN"예컨대) 로케일에 대한 정렬과 인덱스 만들기

    예로서:

    사례를 구분하기위한 강도 1 또는 2와 조합 만들기

    private readonly Collation _caseInsensitiveCollation = new Collation("en", strength: CollationStrength.Primary);
    

    인덱스를 만듭니다. 내 경우 I 지수 여러 분야에서 :

    private void CreateIndex()
    {
        var indexOptions = new CreateIndexOptions {Collation = _caseInsensitiveCollation};
        var indexDefinition
            = Builders<MyDto>.IndexKeys.Combine(
                Builders<MyDto>.IndexKeys.Ascending(x => x.Foo),
                Builders<MyDto>.IndexKeys.Ascending(x => x.Bar));
        _myCollection.Indexes.CreateOne(indexDefinition, indexOptions);
    }
    

    메이크업을 조회 할 때 반드시 동일한 데이터 정렬을 사용합니다 :

    public IEnumerable<MyDto> GetItems()
    {
        var anyFilter = GetQueryFilter();
        var anySort = sortBuilder.Descending(x => x.StartsOn);  
        var findOptions = new FindOptions {Collation = _caseInsensitiveCollation};
    
        var result = _salesFeeRules
            .Find(anyFilter, findOptions)
            .Sort(anySort)
            .ToList();
    
        return result;
    }
    
  10. ==============================

    10.이것은 정확한 텍스트 검색 및 대소 문자를 구별 (링크 참조).

    이것은 정확한 텍스트 검색 및 대소 문자를 구별 (링크 참조).

    { “FieldName” : /^keywordHere$/i }
    
  11. from https://stackoverflow.com/questions/4458950/mongodb-and-c-case-insensitive-search by cc-by-sa and MIT license