programing

필드에 문자열이 포함되어 있는지 확인

iphone6s 2023. 3. 3. 17:08
반응형

필드에 문자열이 포함되어 있는지 확인

필드 값에 특정 문자열이 포함되어 있는지 확인할 수 있는 연산자를 찾고 있습니다.

예를 들어 다음과 같습니다.

db.users.findOne({$contains:{"username":"son"}})

그게 가능한가요?

다음과 같은 코드로 할 수 있습니다.

db.users.findOne({"username" : {$regex : "son"}});

Mongo 쉘은 regex를 지원하므로 충분히 가능합니다.

db.users.findOne({"username" : /.*son.*/});

쿼리에서 대소문자를 구분하지 않으려면 다음과 같이 "i" 옵션을 사용할 수 있습니다.

db.users.findOne({"username" : /.*son.*/i});

참조: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-RegularExpressions

https://docs.mongodb.com/manual/reference/sql-comparison/

http://php.net/manual/en/mongo.sqltomongo.php

MySQL

SELECT * FROM users WHERE username LIKE "%Son%"

MongoDB

db.users.find({username:/Son/})

버전 2.4부터는 필드에 텍스트인덱스를 생성하여 $text 연산자를 검색하여 쿼리할 수 있습니다.

먼저 인덱스를 만듭니다.

db.users.createIndex( { "username": "text" } )

검색 방법:

db.users.find( { $text: { $search: "son" } } )

벤치마크 (최대 15만 문서):

  • Regex (기타 응답) => 5.6-6.9초
  • 텍스트 검색 => .timeout-.201초

주의:

  • 컬렉션에는 텍스트 인덱스를 하나만 포함할 수 있습니다.다음과 같이 임의의 문자열 필드를 검색하는 경우 와일드카드텍스트 인덱스를 사용할 수 있습니다.db.collection.createIndex( { "$**": "text" } ).
  • 텍스트 색인은 클 수 있습니다.삽입된 각 문서에 대해 색인화된 각 필드에 고유한 포스트스템 단어에 대해 하나의 색인 항목이 있습니다.
  • 텍스트 인덱스를 작성하는 데 일반 인덱스보다 시간이 오래 걸립니다.
  • 텍스트 색인은 문서의 단어 근접성에 대한 구문이나 정보를 저장하지 않습니다.그 결과 전체 컬렉션이 RAM에 적합할 때 구문 조회가 훨씬 효율적으로 실행됩니다.

이것은 검색 엔진의 첫 번째 히트 중 하나이며, 위의 어느 것도 MongoDB 3.x에서는 동작하지 않는 것 같기 때문에, 여기 기능하는 regex 검색이 하나 있습니다.

db.users.find( { 'name' : { '$regex' : yourvalue, '$options' : 'i' } } )

추가 인덱스를 작성할 필요가 없습니다.

Python을 통해 MongoDB를 연결할 경우 다음과 같이 하십시오.

db.users.find({"username": {'$regex' : '.*' + 'Son' + '.*'}})

또한 'Son' 대신 변수 이름을 사용할 수 있으며, 따라서 문자열 연결도 사용할 수 있습니다.

이 작업을 수행하는 가장 간단한 방법

조회 시 대소문자를 구분하는 경우

db.getCollection("users").find({'username':/Son/})

대소문자를 구분하지 않는 쿼리를 원하는 경우

db.getCollection("users").find({'username':/Son/i})

대소문자를 구분하기 위한 사용 지수 i 옵션에 대한 이상적인 답변

db.users.findOne({"username" : new RegExp(search_value, 'i') });

이것으로 충분합니다.

db.users.find({ username: { $in: [ /son/i ] } });

i하나의 문자와 일치하는 제한을 방지하기 위한 것입니다.

하실 수 .$regexMongoDB 매뉴얼을 참조하십시오.다음 링크입니다.https://docs.mongodb.com/manual/reference/operator/query/regex/

이 코드를 사용하여 하위 문자열을 검색합니다.

db.users.find({key: { $regex: new RegExp(value, 'i')}})

여러 Atribute를 검색해야 할 경우 $or를 사용할 수 있습니다.예를들면

Symbol.find(
  {
    $or: [
      { 'symbol': { '$regex': input, '$options': 'i' } },
      { 'name': { '$regex': input, '$options': 'i' } }
    ]
  }
).then((data) => {
  console.log(data)
}).catch((err) => {
  console.log(err)
})

입력이 기호 속성과 이름 속성에 포함되어 있는지 여부를 기준으로 검색을 수행합니다.

Aggregate 솔루션에서 regex가 작동하지 않고 중첩된 개체가 있는 경우.집약 파이프라인을 사용해 보십시오. (오브젝트 구조가 단순하다면 아래 쿼리에서 다른 조건을 삭제하십시오.)

db.user.aggregate({$match: 
     {$and:[
   {"UserObject.Personal.Status":"ACTV"},
   {"UserObject.Personal.Address.Home.Type":"HME"},
   {"UserObject.Personal.Address.Home.Value": /.*son.*/ }
   ]}}
   ) 

다른 방법으로는 다음과 같이 직접 문의하는 방법이 있습니다.

db.user.findOne({"UserObject.Personal.Address.Home.Value": /.*son.*/ });

정규식에 변수가 포함되어 있는 경우 변수를 이스케이프하십시오.

function escapeRegExp(string) {
  return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}

이것은 이렇게 사용할 수 있습니다.

new RegExp(escapeRegExp(searchString), 'i')

또는 이와 같은 mongoDb 쿼리에서

{ '$regex': escapeRegExp(searchString) }

여기에 같은 코멘트를 투고했습니다.

집약 프레임워크의 경우


필드 검색

('$options': 'i'대소문자를 구분하지 않는 검색)

db.users.aggregate([
    {
        $match: {
            'email': { '$regex': '@gmail.com', '$options': 'i' }
        }
    }
]);

전체 문서 검색

(텍스트 인덱스로 인덱싱된 필드에서만 작동합니다.)

db.articles.aggregate([
    {
        $match: { $text: { $search: 'brave new world' } }
    }
])

RegExp 일치에서 HTML 태그를 무시하는 방법:

var text = '<p>The <b>tiger</b> (<i>Panthera tigris</i>) is the largest <a href="/wiki/Felidae" title="Felidae">cat</a> <a href="/wiki/Species" title="Species">species</a>, most recognizable for its pattern of dark vertical stripes on reddish-orange fur with a lighter underside. The species is classified in the genus <i><a href="/wiki/Panthera" title="Panthera">Panthera</a></i> with the <a href="/wiki/Lion" title="Lion">lion</a>, <a href="/wiki/Leopard" title="Leopard">leopard</a>, <a href="/wiki/Jaguar" title="Jaguar">jaguar</a>, and <a href="/wiki/Snow_leopard" title="Snow leopard">snow leopard</a>. It is an <a href="/wiki/Apex_predator" title="Apex predator">apex predator</a>, primarily preying on <a href="/wiki/Ungulate" title="Ungulate">ungulates</a> such as <a href="/wiki/Deer" title="Deer">deer</a> and <a href="/wiki/Bovid" class="mw-redirect" title="Bovid">bovids</a>.</p>';
var searchString = 'largest cat species';

var rx = '';
searchString.split(' ').forEach(e => {
  rx += '('+e+')((?:\\s*(?:<\/?\\w[^<>]*>)?\\s*)*)';
});

rx = new RegExp(rx, 'igm');

console.log(text.match(rx));

이것은 MongoDB 집약 필터로 변환하는 것은 매우 간단합니다.

언급URL : https://stackoverflow.com/questions/10610131/checking-if-a-field-contains-a-string

반응형