etc./StackOverFlow

"좋아요"로 MongoDB를 쿼리하는 방법

청렴결백한 만능 재주꾼 2022. 1. 8. 01:38
반응형

질문자 :Freewind


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

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

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



다음과 같아야 합니다.

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

또는 유사:

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

문자열의 시작 부분에 "m"이 고정된 것이 아니라 어딘가에 "m"이 포함된 것을 찾고 있습니다(SQL의 ' % ' 연산자는 정규식 ' .*

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

정규 표현식에 대한 자세한 내용을 참조 정규 표현식 (MDN).


Kyle H

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'

출력: 페드로


Johnathan Douglas

  • 파이썬을 사용하는 파이몽고
  • Node.js를 사용하는 몽구스
  • 자바를 사용하는 종고
  • mgo , Go 사용

넌 할 수있어:

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

Afshin Mehrabani

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

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

Leon

다음은 정규 표현식을 사용한 문자열 검색에 대한 다양한 유형의 요구 사항 및 솔루션입니다.

같은 단어를 포함하는 정규식으로 할 수 있습니다. 또한 대소문자를 구분하지 않는 검색을 위해 $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'}})

정규식 치트 시트 를 책갈피로 유지하고 필요할 수 있는 다른 변경 사항에 대한 참조를 유지합니다.


Somnath Muluk

MongoDB에서 정규식을 사용합니다.

예를 들어,

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

Joshua Partogi

두 가지 선택이 있습니다.

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

또는

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

두 번째 옵션의 경우 대소문자를 구분하지 않고 찾는 옵션에 "i"와 같은 더 많은 옵션이 있습니다.

그리고 "string"에 대해서는 ". string. "(%string%) 또는 "string.*"(string%) 및 ".*string)(%string)과 같이 사용할 수 있습니다. 일반 원하는 대로 표현합니다.


alvescleiton

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') } );

Eddy

이미 답을 얻었지만 대소문자를 구분하지 않는 정규식과 일치시키기 위해 다음 쿼리를 사용할 수 있습니다.

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

i/m/i 소문자 구분하고 나타내는 .pretty() 더 예쁜 출력을 제공한다.


The6thSense

Node.js의 몽구스:

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

Aqib Mumtaz

MongoDB Compass를 사용하면 다음과 같이 엄격 모드 구문을 사용해야 합니다.

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

(에서 MongoDB를 나침반, 당신이 사용하는 것이 중요하다 " 대신 ' )


damd

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

 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" } });

cmarrero01

Node.js 프로젝트에서 Mongoose 를 사용하여 다음 과 같은 쿼리를 사용합니다.

 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); });

Shaishab Roy

변수와 함께 템플릿 리터럴을 사용할 수도 있습니다.

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


besthost

where 문을 사용하여 JavaScript 스크립트를 작성할 수 있습니다.

 db.myCollection.find( { $where: "this.name.toLowerCase().indexOf('m') >= 0" } );

참조: $where


briba

PHP 몽고 처럼 .

PHP mongo와 같은 몇 가지 문제가 있었습니다. 정규 표현식 매개변수를 연결하면 PHP mongo 찾기 필드가 로 시작하는 상황에서 도움이 됩니다.

예를 들어,

 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)

Dap

Go 및 mgo 드라이버에서:

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

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


user2312578

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 구조를 생성합니다.


MADHAIYAN M

정규식은 처리하는 데 비용이 많이 듭니다.

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

검색 가능하게 만들 필드의 텍스트 인덱스를 만듭니다.

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

텍스트 인덱스에서 문자열 검색:

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

Rusty

아래와 같이 정규식 일치를 사용합니다. '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);

Shalabh Raizada

유사 쿼리는 아래와 같습니다.

 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]

prayagupd

/regex_pattern/ 패턴과 MongoDB {'$regex': 'regex_pattern'} 패턴을 모두 사용하는 데에는 이유가 있는 것 같습니다. 참조: MongoDB 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" }

Bruno Bronosky

Spring-Data MongoDB를 사용하는 경우 다음과 같이 할 수 있습니다.

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

Vaibhav

문자열 변수가 있는 경우 정규식으로 변환해야 하므로 MongoDB는 이에 대해 like 문을 사용합니다.

 const name = req.query.title; //John db.users.find({ "name": new Regex(name) });

다음과 같은 결과입니다.

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

Lazaro Fernandes Lima Suleiman

문자열 yourdb = {deepakparmar, dipak, parmar

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

딥팍파르마르

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

디팍, 디팍

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

as deepakparmar, parmar


Deepak parmar

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

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

kz_sergey

MongoDB 셸은 정규식을 지원하므로 완전히 가능합니다.

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

쿼리가 대소문자를 구분하지 않도록 하려면 아래와 같이 "i" 옵션을 사용할 수 있습니다.

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

sravanthi

MongoDB에서 '좋아요' 검색을 원하면 $regex 를 사용해야 합니다. 이를 사용하면 쿼리는 다음과 같습니다.

 db.product.find({name:{$regex:/m/i}})

자세한 내용은 문서도 읽을 수 있습니다 - $regex


jarry jafery

정규 표현식으로 쿼리할 수 있습니다.

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

문자열이 사용자로부터 오는 경우 사용하기 전에 문자열을 이스케이프하고 싶을 수 있습니다. 이렇게 하면 사용자의 리터럴 문자가 정규식 토큰으로 해석되는 것을 방지할 수 있습니다.

예를 들어 "A" 문자열을 검색합니다. 이스케이프되지 않은 경우 "AB" 와도 일치합니다. replace 를 사용하여 문자열을 이스케이프할 수 있습니다. 재사용을 위한 함수로 만들었습니다.

 function textLike(str) { var escaped = str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&'); return new RegExp(escaped, 'i'); }

이제 문자열은 리터럴 점과도 일치하는 대소문자를 구분하지 않는 패턴이 됩니다. 예시:

 > textLike('A.'); < /A\./i

이제 이동 중에 정규식을 생성할 준비가 되었습니다.

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

Ezequias Dinella

MongoRegex는 더 이상 사용되지 않습니다.

MongoDB\BSON\Regex 사용 :

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

Albert s

출처 : http:www.stackoverflow.com/questions/3305561/how-to-query-mongodb-with-like

반응형