IT Share you

Mongo에서 대소 문자를 구분하지 않는 검색

shareyou 2021. 1. 9. 10:52
반응형

Mongo에서 대소 문자를 구분하지 않는 검색


Mongo에서 https://stackoverflow.com/q/5500823/1028488 과 유사한 대소 문자를 구분하지 않는 검색을 사용하고 있습니다 .

즉, 옵션 i와 함께 정규식을 사용하고 있습니다. 하지만 정규식을 해당 단어로 제한하는 데 문제가 있습니다. SQL에서 '좋아요'와 비슷하게 수행됩니다.

예 : 같은 쿼리를 사용하면 {"SearchWord" : { '$regex' : 'win', $options: '-i' }}win, window 및 winter에 대한 결과가 표시됩니다. jsut show win으로 제한하려면 어떻게합니까?

나는 시도 /^win$/했지만 유효하지 않은 Json .... 방법을 제안하십시오.

미리 감사드립니다


'$regex':'^win$'또는 사용할 수 있습니다 /^win$/i(두 번째에는 따옴표가 없습니다).

출처 : Mongo를 사용한 쿼리의 정규식


$options => i대소 문자를 구분하지 않는 검색에 사용할 수 있습니다 . 문자열 일치에 필요한 몇 가지 가능한 예를 제공합니다.

대소 문자를 구분하지 않음 string

db.collection.find({name:{'$regex' : '^string$', '$options' : 'i'}})

포함 string

db.collection.find({name:{'$regex' : 'string', '$options' : 'i'}})

시작 string

db.collection.find({name:{'$regex' : '^string', '$options' : 'i'}})

string

db.collection.find({name:{'$regex' : 'string$', '$options' : 'i'}})

포함하지 않음 string

db.collection.find({name:{'$regex' : '^((?!string).)*$', '$options' : 'i'}})

이것을 책갈피로 보관하고 필요한 기타 변경 사항에 대한 참조로 보관하십시오. http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/


업데이트 : MongoDB 2.4부터는 "텍스트"인덱스와 전체 텍스트 검색 쿼리를 사용하여이를 수행합니다. 여기에서 그들에 대해 읽을 수 있습니다 . 최근 MongoDB를 사용하는 경우 아래의 접근 방식은 어리 석고 불필요합니다.

그러나 MongoDB가 2.4.0 미만인 경우 다음과 같은 정규식을 사용할 수 있습니다.

> db.reg.insert({searchword: "win"})
> db.reg.insert({searchword: "window"})
> db.reg.insert({searchword: "Win"})

> db.reg.find()
{ "_id" : ObjectId("4ecd2e33dd68c9021e453d12"), "searchword" : "win" }
{ "_id" : ObjectId("4ecd2e36dd68c9021e453d13"), "searchword" : "window" }
{ "_id" : ObjectId("4ecd2e39dd68c9021e453d14"), "searchword" : "Win" }

> db.reg.find({ searchword: /^win$/i })
{ "_id" : ObjectId("4ecd2e33dd68c9021e453d12"), "searchword" : "win" }
{ "_id" : ObjectId("4ecd2e39dd68c9021e453d14"), "searchword" : "Win" }

그러나 $ regex 연산자를 사용할 때 "/"가 필요하지 않기 때문에 버전이 작동하지 않았습니다.

> db.reg.find({ searchword: { $regex: "^win$", $options: '-i' }})
{ "_id" : ObjectId("4ecd2e33dd68c9021e453d12"), "searchword" : "win" }
{ "_id" : ObjectId("4ecd2e39dd68c9021e453d14"), "searchword" : "Win" }

대소 문자를 구분하지 않는 쿼리는 색인을 사용하지 않으므로 쿼리 속도를 높일 수 있도록 소문자 검색 단어 필드를 만드는 것이 좋습니다.

Go here for more info on RegularExpressions


Use $strcasecmp. The aggregation framework was introduced in MongoDB 2.2. You can use the string operator "$strcasecmp" to make a case-insensitive comparison between strings. It's more recommended and easier than using regex.

Here's the official document on the aggregation command operator: https://docs.mongodb.com/manual/reference/operator/aggregation/strcasecmp/#exp._S_strcasecmp .


For Case insensitive db.users.find({"name":{ $regex : new RegExp("Vi", "i") }})

For Case sensitive db.users.find({"name":"Vi"}) or db.users.find({"email":"example@mail.com"})

search in user table

name is column name and "Vi" text that are searched

ReferenceURL : https://stackoverflow.com/questions/8246019/case-insensitive-search-in-mongo

반응형