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});
이렇게하면 ‘뉴욕’, ‘뉴욕’, ‘뉴욕’등의 도시가 반환됩니다.
답변
-
Mongoose (및 Node)를 사용하면 다음과 같이 작동했습니다.
-
User.find({ email: /^name@company.com$/i })
-
User.find({ email: new RegExp(
`^ $ {emailVariable} $`, ‘i’)})
-
-
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