"like"로 MongoDB를 쿼리하는 방법은 무엇입니까?


1437

SQL 쿼리로 무언가를 쿼리하고 싶습니다 like.

SELECT * FROM users  WHERE name LIKE '%m%'

MongoDB에서 어떻게 동일한 결과를 얻습니까? 설명서like 에서 연산자를 찾을 수 없습니다 .


7
mongodb의 문서를 참조하십시오 : 고급 쿼리-정규식 mongodb.org/display/DOCS/…
douyw

7
귀하의 질문에 최소한 유사 운영자 태그에 5대한 투표권이 있습니다. sql-like동의어 로 제안하도록 친절하게 요청할 수 있습니까?
커밋

3
이 링크는 당신에게 도움이 될 수 있습니다 goo.gl/gdTYK8
딜립 Kr을 싱

답변:


1945

다음과 같아야합니다.

db.users.find({"name": /.*m.*/})

또는 유사한 :

db.users.find({"name": /m/})

문자열의 시작 부분에 "m"이 고정 된 것이 아니라 "m"이 포함 된 것을 찾고 있습니다 (SQL의 ' %'연산자는 Regexp의 ' .*' 와 동일 함 ).

참고 : mongodb는 SQL에서 "LIKE"보다 강력한 정규식을 사용합니다. 정규 표현식을 사용하면 상상할 수있는 패턴을 만들 수 있습니다.

정규 표현식에 대한 자세한 내용은이 링크를 참조하십시오 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions


96
regex에 의해 검색 비싼?
Freewind

147
실제로는 다릅니다. 쿼리가 인덱스를 사용하지 않고 테이블 스캔을 수행해야하는 경우 확실히 비쌀 수 있습니다. 정규식 쿼리를 '시작'하는 경우 인덱스를 사용할 수 있습니다. 무슨 일이 일어나고 있는지 설명하기 위해 Explain ()을 실행하는 것이 가장 좋습니다.
Kyle Banker

35
문자열의 시작 부분에 고정되어 있지 않으면 다소 비쌉니다. 그러나 다시, LIKESQL 의 쿼리도 마찬가지입니다 .
Emily

4
문자열의 시작 부분에 고정되어 있으면 괜찮습니까? 그럼 시원 해요. 그것은 우리가 ^를 추가해야한다는 것을 의미
합니까?

44
나는 정규식 i를 추가 할 것입니다javascript db.users.find({ "name": { $regex: /m/i } })
Doron Segal

368
db.users.insert({name: 'paulo'})
db.users.insert({name: 'patric'})
db.users.insert({name: 'pedro'})

db.users.find({name: /a/})  //like '%a%'

아웃 : 파울로

db.users.find({name: /^pa/}) //like 'pa%' 

아웃 : 파울로

db.users.find({name: /ro$/}) //like '%ro'

아웃 : 페드로


좋은 예입니다! 나는 공간이 끝나는 체크 끝을 발견하고 이것을 발견했다 :) / $ /
Phuong

이름에 대한 모든 항목을 어떻게 찾습니까? 또는 SQL에서 *에 대한 와일드 카드? 않는 뭔가 select name from users;단지 모든 사용자를 나열?
anon58192932

1
@ anon58192932 "users"라는 테이블에 "name"필드의 모든 항목을 표시하려면 원하는 필드 값을 1로 설정하여 project () 메서드를 사용할 수 있습니다. project ()에 언급되지 않은 필드는 _id를 제외하고 가져 왔습니다. _id 필드는 기본적으로 인쇄되어 project () 메서드에 _id에 0 값을 넣어 억제 할 수 있습니다. -db.collection.find (). project ({name : 1, _id : 0}) .toArray (function (err, docs) {console.log (docs); callback (docs);}); -이 참조 docs.mongodb.com/manual/tutorial/...
gauravparmar

282

  • 파이썬을 사용하는 PyMongo
  • Node.js를 사용하는 몽구스
  • Java를 사용하는 Jongo
  • Go를 사용하여 mgo

넌 할 수있어:

db.users.find({'name': {'$regex': 'sometext'}})

2
대소 문자를 구분하는 검색에 제대로 작동합니다. 대소 문자를 구분하지 않고 검색을 수행하는 방법을 알려주시겠습니까?
Tahir Yasin

에 대 한 정규식이 될 것입니다%sometext%
Tahir Yasin

64
@TahirYasin 여전히 궁금하다면 대소 문자를 구분하지 않는 검색은 다음과 같습니다 :db.users.find({'name': {'$regex': 'sometext', '$options': 'i'}})
sumowrestler

= bson.M {기술} "기술자": : : bson.M { "$ 정규식"} 나는 선택이 같은 산화 마그네슘 단순히 코드를 사용하여 golang에 해결
Sandun Priyanka의

1
이것이 대답이 될 것 같은 느낌. 현재 가장 단순하고 가장 우아합니다.
Brett84c

88

PHP에서는 다음 코드를 사용할 수 있습니다.

$collection->find(array('name'=> array('$regex' => 'm'));

4
python + mongoengine : 사람들 = People.objects.raw_query ({ 'name': { '$ regex': 'm'}})
panchicore

1
RegEx 값이 사용자 입력 (예 : 필터 형식)에서 발생하고 값 자체를 RegExp로 사용하지 않으려면 preg_quote ()를 적용해야합니다.
Philipp Rieber

2
난 그냥이 실현, 그러나 이것은 그것이 차선, 당신은 대신 MongoRegex를 통해 실제 BSON 정규식 개체를 사용해야입니다 작동에도 불구하고, 실제로 잘못된 답변입니다, $ 정규식에서 $와 같은 특정 명령과의 호환성 문제가
Sammaye

이 구문은 값이 변수에 저장되어 있으면 쿼리를 다음과 같이 작성할 수 있습니다 (루비).$collection.where(field => {"$regex" => value})
Donny Kurnia

그러나 왜 배열 리터럴을 사용할 수 없습니까?
Alper

53

몽고에서는 정규 표현식을 사용합니다.

예 : db.users.find({"name": /^m/})


29
나는 이것이 "m"으로 시작하는 이름 값을 가진 문서들만을 보여줄 것이라고 생각한다
JackAce

53

이미 많은 답변이 있습니다. 정규식으로 문자열 검색을위한 다양한 유형의 요구 사항과 솔루션을 제공하고 있습니다.

단어를 포함하는 정규 표현식으로 할 수 있습니다. $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'}})

이것을 책갈피로 유지 하고 필요한 다른 변경 사항에 대한 참조로 유지하십시오 .


37

두 가지 선택이 있습니다 :

db.users.find({"name": /string/})

또는

db.users.find({"name": {"$regex": "string", "$options": "i"}})

두 번째 옵션에서는 대소 문자를 구분하지 않고 찾을 수있는 옵션에 "i"와 같은 추가 옵션이 있습니다. "string"에 대해서는 ".string . "(% string %) 또는 "string. *"(string %) 및 ". * string) (% string)과 같이 사용할 수 있습니다. 정규식을 사용할 수 있습니다. 원하는대로.

즐겨!


34

사용하는 경우 Node.js를을 , 그것은 당신이 쓸 수 있다고 말한다 :

db.collection.find( { field: /acme.*corp/i } );
//or
db.collection.find( { field: { $regex: 'acme.*corp', $options: 'i' } } );

또한 다음 과 같이 작성할 수 있습니다.

db.collection.find( { field: new RegExp('acme.*corp', 'i') } );

루비의 비슷한 문법 :collection.where(field => Regexp.new(value))
Donny Kurnia

24

이미 답을 얻었지만 대소 문자를 구분하지 않는 정규 표현식과 일치시킵니다.

다음 쿼리를 사용할 수 있습니다

db.users.find ({ "name" : /m/i } ).pretty()

i에서는 /m/i소문자 구분을 표시하고 .pretty()더 예쁜 출력을 제공


하지만 여기서 동적으로 값을 설정하려면
KS

@ KuldeepKoranga 'm'대신에 동적 값을 배치 할 수 있습니다. 너가 원하는게 그거야.
The6thSense

var search="feacebook"@ The6thSens 예 아래에서 어떻게 설정할 수 db.users.find ({ "name" : /search/i } )있습니까?
KS

@KuldeepKoranga 당신은 값을 할당했습니다.
The6thSense

1
@KuldeepKoranga stackoverflow.com/questions/7790811/… 이것이 도움이
됩니까


13

2.6 mongodb의 새로운 기능을 사용할 수 있습니다.

db.foo.insert({desc: "This is a string with text"});
db.foo.insert({desc:"This is a another string with Text"});
db.foo.ensureIndex({"desc":"text"});
db.foo.find({
    $text:{
        $search:"text"
    }
});

6
AFAIK Mongodb의 텍스트 검색은 기본적으로 전체 단어에서만 작동하므로 "이것은 텍스트가있는 문자열입니다"와 같은 값과 일치하지만 "이것은 하위 텍스트가있는 문자열입니다"와는 일치하지 않습니다. 따라서 sql의 "LIKE"연산자와는 다릅니다.
rocketmonkeys

@Rocketmonkeys는 사실입니다. "LIKE operator"와 같은 경우 $ regex mongo 연산자를 사용합니다.
cmarrero01

13

에서 nodejs 프로젝트 및 사용 몽구스 사용 쿼리처럼

var User = mongoose.model('User');

var searchQuery={};
searchQuery.email = req.query.email;
searchQuery.name = {$regex: req.query.name, $options: 'i'};
User.find(searchQuery, function(error, user) {
                if(error || user === null) {
                    return res.status(500).send(error);
                }
                return res.status(200).send(user);
            });

쿼리처럼 사용하려면 어떻게해야합니까? 나는 이것을 시도했지만 작동하지 않습니다 :searchQuery.product_name = '/'+req.query.search.value+'/i';
Muhammad Shahzad 17:01에

같은 시도 할 수 있습니다 :searchQuery.product_name= {$regex: req.query.search.value, $options: 'i'};
Shaishab 로이에게

내 인생 친구를 구해 pls는 $ regex와 $ options가 무엇인지 거의 설명 할 수 없습니까?
Muhammad Shahzad

if(req.query.search.value){ searchQuery.product_name = {$regex: req.query.search.value, $options: 'i'}; searchQuery.sale_amount = {$regex: req.query.search.value, $options: 'i'}; searchQuery.sale_person = {$regex: req.query.search.value, $options: 'i'}; searchQuery.department_name = {$regex: req.query.search.value, $options: 'i'}; searchQuery.sale_date = {$regex: req.query.search.value, $options: 'i'}; }왜 이것이 작동하지 않는지 볼 수 있습니까?
Muhammad Shahzad

$regex: 'value' 검색 값에 대한 정규 표현식을 생성 $options: 'i'수단 의 경우를 구분 . 다른 속성에 동일한 값을 사용 했고 데이터베이스 컬렉션으로 충족되지 않아야하는 조건으로 작동하여 코드가 작동하지 않았습니다 .
Shaishab Roy

12

PHP 몽고 좋아요.
PHP mongo와 같은 몇 가지 문제가있었습니다. 정규식 매개 변수를 연결하면 PHP 몽고 찾기 필드가로 시작되는 상황에 도움이된다는 것을 알았 습니다 . 더 인기있는 스레드에 기여하기 위해 여기에 게시 할 것이라고 생각했습니다.

예 :

db()->users->insert(['name' => 'john']);
db()->users->insert(['name' => 'joe']);
db()->users->insert(['name' => 'jason']);

// starts with
$like_var = 'jo';
$prefix = '/^';
$suffix = '/';
$name = $prefix . $like_var . $suffix;
db()->users->find(['name' => array('$regex'=>new MongoRegex($name))]);
output: (joe, john)

// contains
$like_var = 'j';
$prefix = '/';
$suffix = '/';
$name = $prefix . $like_var . $suffix;
db()->users->find(['name' => array('$regex'=>new MongoRegex($name))]);

output: (joe, john, jason)

이전 답변과 의견에 따라 $ text (Index) 검색은 $ regex 방법과 비교하여 벤치 마크를 사용하여 더 나은 솔루션을 제공합니다. 참조를 위해이 링크 stackoverflow.com/questions/10610131/…을 확인하십시오 . PHP와 mongoDB로 $ text index 메소드를 구현할 수 있습니까?
sankar muniyappa

12

변수와 함께 템플릿 리터럴을 사용하면 작동합니다.

{"firstname": {$regex : `^${req.body.firstname}.*` , $options: 'si' }}


예를 들어 "firstname"에 testlast가 포함되어 있고 "last"로 검색하면 결과가 표시되지 않습니다.
Vikas Chauhan

11

MongoDB Compass에서는 다음과 같이 엄격한 모드 구문을 사용해야합니다.

{ "text": { "$regex": "^Foo.*", "$options": "i" } }

(MongoDB Compass에서는 사용하는 것이 중요합니다. " 대신 대신 하는' )



10

SQL에서 ' like '쿼리는 다음과 같습니다.

select * from users where name like '%m%'

MongoDB 콘솔에서는 다음과 같습니다.

db.users.find({"name": /m/})     // Not JSON formatted

db.users.find({"name": /m/}).pretty()  // JSON formatted

또한 pretty()메소드는 더 읽기 쉬운 형식의 JSON 구조를 생성하는 모든 장소에서 사용됩니다.


10

정규식은 비용이 많이 듭니다.

또 다른 방법은 텍스트 색인을 만든 다음 다음을 사용하여 검색하는 것입니다. $search 입니다.

검색 할 텍스트 색인 필드를 작성하십시오.

db.collection.createIndex({name: 'text', otherField: 'text'});

텍스트 인덱스에서 문자열을 검색하십시오.

db.collection.find({
  '$text'=>{'$search': "The string"}
})

완벽한 솔루션 ... 정규식은 비싸다. 20m 문서의 데이터 세트로 작업하면 성능 차이가 매우 눈에 띄게 나타납니다 (
과언이 아닙니다

1
실제로 이것은 전체 단어에 대해서만 작동합니다. docs.mongodb.com/manual/core/index-text/#index-entries
Thomas Ebert

8

Go와 mgo 드라이버에서 :

Collection.Find(bson.M{"name": bson.RegEx{"m", ""}}).All(&result)

여기서 result는 찾는 유형의 구조체 인스턴스입니다.


2
pls는 문자 그대로의 키가없는 필드를 피하고 bson:RegEx{Pattern:"m", Options:"i"}대신
해라

8

아래와 같이 정규식을 사용하십시오. 'i'는 대소 문자를 구분하지 않습니다.

var collections = mongoDatabase.GetCollection("Abcd");

var queryA = Query.And(
         Query.Matches("strName", new BsonRegularExpression("ABCD", "i")), 
         Query.Matches("strVal", new BsonRegularExpression("4121", "i")));

var queryB = Query.Or(
       Query.Matches("strName", new BsonRegularExpression("ABCD","i")),
       Query.Matches("strVal", new BsonRegularExpression("33156", "i")));

var getA = collections.Find(queryA);
var getB = collections.Find(queryB);

6

같은 쿼리는 다음과 같습니다

db.movies.find({title: /.*Twelve Monkeys.*/}).sort({regularizedCorRelation : 1}).limit(10);

scala ReactiveMongo API의 경우

val query = BSONDocument("title" -> BSONRegex(".*"+name+".*", "")) //like
val sortQ = BSONDocument("regularizedCorRelation" -> BSONInteger(1))
val cursor = collection.find(query).sort(sortQ).options(QueryOpts().batchSize(10)).cursor[BSONDocument]

6

/regex_pattern/몽고 {'$regex': 'regex_pattern'}패턴 뿐만 아니라 자바 스크립트 패턴 을 모두 사용해야하는 이유가있는 것 같습니다 . 참조 : MongoBD RegEx 구문 제한

이것은 완전한 RegEx 튜토리얼은 아니지만 위의 투표에서 모호한 게시물을 본 후 이러한 테스트를 실행하도록 영감을 받았습니다 .

> ['abbbb','bbabb','bbbba'].forEach(function(v){db.test_collection.insert({val: v})})

> db.test_collection.find({val: /a/})
{ "val" : "abbbb" }
{ "val" : "bbabb" }
{ "val" : "bbbba" }

> db.test_collection.find({val: /.*a.*/})
{ "val" : "abbbb" }
{ "val" : "bbabb" }
{ "val" : "bbbba" }

> db.test_collection.find({val: /.+a.+/})
{ "val" : "bbabb" }

> db.test_collection.find({val: /^a/})
{ "val" : "abbbb" }

> db.test_collection.find({val: /a$/})
{ "val" : "bbbba" }

> db.test_collection.find({val: {'$regex': 'a$'}})
{ "val" : "bbbba" }

5

Spring-Data Mongodb를 사용하는 경우 다음과 같은 방법으로이를 수행 할 수 있습니다.

String tagName = "m";
Query query = new Query();
query.limit(10);        
query.addCriteria(Criteria.where("tagName").regex(tagName));

4

Mongo 쉘이 정규식을 지원하므로 완전히 가능합니다.

db.users.findOne({"name" : /.*sometext.*/});

쿼리에서 대소 문자를 구분하지 않으려면 아래에 표시된 것처럼 "i"옵션을 사용할 수 있습니다.

db.users.findOne({"name" : /.*sometext.*/i});


4

집계 하위 문자열 검색 사용 (인덱스 포함) :

db.collection.aggregate([{
        $project : {
            fieldExists : {
                $indexOfBytes : ['$field', 'string']
            }
        }
    }, {
        $match : {
            fieldExists : {
                $gt : -1
            }
        }
    }, {
        $limit : 5
    }
]);

좋은! 전체 문서를 일치시키는 방법이 있습니까? 또는 집계 프레임 워크가 후속 조회를 수행하도록합니까? 현재 경기는 다음과 같습니다.{ "_id" : ObjectId("5aba5ad988385120a01b1ac2"), "fieldExists" : 4 }
Gianfranco P.

$ project 단계에서 원하는 것을 투영하십시오
Vokail

4

문자열 디 팍파 마르, 디팍, 파 마르

db.getCollection('yourdb').find({"name":/^dee/})

ans deepakparmar

db.getCollection('yourdb').find({"name":/d/})

ans deepakparmar, 디팍

db.getCollection('yourdb').find({"name":/mar$/})

ans deepakparmar, 파 마르


2

MYSQL 쿼리를 MongoDB로 변환하는 무료 도구를 찾았습니다. http://www.querymongo.com/ 몇 가지 쿼리로 확인했습니다. 내가 볼 수 있듯이 거의 모든 것이 정확합니다. 그것에 따르면, 대답은

db.users.find({
    "name": "%m%"
});

2

MongoRegex는 더 이상 사용되지 않습니다.
MongoDB \ BSON \ Regex를 사용하십시오.

$regex = new MongoDB\BSON\Regex ( '^m');
$cursor = $collection->find(array('users' => $regex));
//iterate through the cursor

이것은 PHPMongoRegex 클래스를 나타냅니다 . 노드에 관한이 질문과 관련이 없습니다. 이것은 아마도 의견이거나 더 좋을 것입니다-별도의 게시물에 자체 답변 된 질문.
보아스-복원 모니카

2
db.customer.find({"customerid": {"$regex": "CU_00000*", "$options": "i"}}).pretty()

문자열 패턴을 검색 할 때는 항상 대소 문자를 모를 때와 같이 위 패턴을 사용하는 것이 좋습니다. 희망이 도움이됩니다 !!!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.