like
쿼리로 무언가를 쿼리하고 싶습니다.
SELECT * FROM users WHERE name LIKE '%m%'
MongoDB에서 어떻게 동일한 결과를 얻을 수 있습니까? 문서 에서 like
에 대한 연산자를 찾을 수 없습니다.
질문자 :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).
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'
출력: 페드로
에
넌 할 수있어:
db.users.find({'name': {'$regex': 'sometext'}})
PHP에서는 다음 코드를 사용할 수 있습니다.
$collection->find(array('name'=> array('$regex' => 'm'));
다음은 정규 표현식을 사용한 문자열 검색에 대한 다양한 유형의 요구 사항 및 솔루션입니다.
같은 단어를 포함하는 정규식으로 할 수 있습니다. 또한 대소문자를 구분하지 않는 검색을 위해 $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'}})
정규식 치트 시트 를 책갈피로 유지하고 필요할 수 있는 다른 변경 사항에 대한 참조를 유지합니다.
MongoDB에서 정규식을 사용합니다.
예를 들어,
db.users.find({"name": /^m/})
두 가지 선택이 있습니다.
db.users.find({"name": /string/})
또는
db.users.find({"name": {"$regex": "string", "$options": "i"}})
두 번째 옵션의 경우 대소문자를 구분하지 않고 찾는 옵션에 "i"와 같은 더 많은 옵션이 있습니다.
그리고 "string"에 대해서는 ". string. "(%string%) 또는 "string.*"(string%) 및 ".*string)(%string)과 같이 사용할 수 있습니다. 일반 원하는 대로 표현합니다.
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') } );
이미 답을 얻었지만 대소문자를 구분하지 않는 정규식과 일치시키기 위해 다음 쿼리를 사용할 수 있습니다.
db.users.find ({ "name" : /m/i } ).pretty()
i
에 /m/i
소문자 구분하고 나타내는 .pretty()
더 예쁜 출력을 제공한다.
Node.js의 몽구스:
db.users.find({'name': {'$regex': '.*sometext.*'}})
MongoDB Compass를 사용하면 다음과 같이 엄격 모드 구문을 사용해야 합니다.
{ "text": { "$regex": "^Foo.*", "$options": "i" } }
(에서 MongoDB를 나침반, 당신이 사용하는 것이 중요하다 "
대신 '
)
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" } });
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); });
변수와 함께 템플릿 리터럴을 사용할 수도 있습니다.
{"firstname": {$regex : `^${req.body.firstname}.*` , $options: 'si' }}
where 문을 사용하여 JavaScript 스크립트를 작성할 수 있습니다.
db.myCollection.find( { $where: "this.name.toLowerCase().indexOf('m') >= 0" } );
참조: $where
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)
Go 및 mgo 드라이버에서:
Collection.Find(bson.M{"name": bson.RegEx{"m", ""}}).All(&result)
여기서 결과는 찾는 유형의 구조체 인스턴스입니다.
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 구조를 생성합니다.
정규식은 처리하는 데 비용이 많이 듭니다.
또 다른 방법은 텍스트 인덱스를 만든 다음 $search
사용하여 검색하는 것입니다.
검색 가능하게 만들 필드의 텍스트 인덱스를 만듭니다.
db.collection.createIndex({name: 'text', otherField: 'text'});
텍스트 인덱스에서 문자열 검색:
db.collection.find({ '$text'=>{'$search': "The string"} })
아래와 같이 정규식 일치를 사용합니다. '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);
유사 쿼리는 아래와 같습니다.
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]
/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" }
Spring-Data MongoDB를 사용하는 경우 다음과 같이 할 수 있습니다.
String tagName = "m"; Query query = new Query(); query.limit(10); query.addCriteria(Criteria.where("tagName").regex(tagName));
문자열 변수가 있는 경우 정규식으로 변환해야 하므로 MongoDB는 이에 대해 like 문을 사용합니다.
const name = req.query.title; //John db.users.find({ "name": new Regex(name) });
다음과 같은 결과입니다.
db.users.find({"name": /John/})
문자열 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
집계 하위 문자열 검색 사용(인덱스!!! 포함):
db.collection.aggregate([{ $project : { fieldExists : { $indexOfBytes : ['$field', 'string'] } } }, { $match : { fieldExists : { $gt : -1 } } }, { $limit : 5 } ]);
MongoDB 셸은 정규식을 지원하므로 완전히 가능합니다.
db.users.findOne({"name" : /.*sometext.*/});
쿼리가 대소문자를 구분하지 않도록 하려면 아래와 같이 "i" 옵션을 사용할 수 있습니다.
db.users.findOne({"name" : /.*sometext.*/i});
MongoDB에서 '좋아요' 검색을 원하면 $regex 를 사용해야 합니다. 이를 사용하면 쿼리는 다음과 같습니다.
db.product.find({name:{$regex:/m/i}})
자세한 내용은 문서도 읽을 수 있습니다 - $regex
정규 표현식으로 쿼리할 수 있습니다.
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") });
MongoRegex는 더 이상 사용되지 않습니다.
MongoDB\BSON\Regex 사용 :
$regex = new MongoDB\BSON\Regex ( '^m'); $cursor = $collection->find(array('users' => $regex)); //iterate through the cursor
출처 : http:www.stackoverflow.com/questions/3305561/how-to-query-mongodb-with-like
Mac OS X의 지정된 TCP 포트에서 누가 듣고 있습니까? (0) | 2022.01.08 |
---|---|
Git에서 대소문자만 구분하는 파일 이름 변경을 커밋하려면 어떻게 해야 합니까? (0) | 2022.01.08 |
양식 제출과 같은 JavaScript 게시 요청 (0) | 2022.01.08 |
추상 메서드와 가상 메서드의 차이점은 무엇입니까? (0) | 2022.01.08 |
IDisposable 인터페이스의 적절한 사용 (0) | 2022.01.08 |