MongoDBに「like」でクエリする方法は?


1437

SQLのlikeクエリで何かをクエリしたい:

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

MongoDBで同じようにするにはどうすればよいですか?私はのための演算子を見つけることができませんlikeのドキュメント


7
MongoDBののドキュメントを参照してください。高度なクエリー-正規表現mongodb.org/display/DOCS/...
douyw

7
あなたの質問には、少なくともlike-operatorタグ5への投票があります。sql-like同義語として提案するようにお願いできますか?
Kermit

3
このリンクは、goo.gl / gdTYK8
Dilip Kr Singh、

回答:


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
正規表現による検索は高価ですか?
Freewind

147
実際には、状況によって異なります。クエリがインデックスを使用せず、テーブルスキャンを実行する必要がある場合、確かにコストがかかる可能性があります。「で始まる」正規表現クエリを実行している場合は、インデックスを使用できます。Explain()を実行して何が起こっているかを確認するのが最善です。
カイルバンカー

35
文字列の先頭にアンカーされていない場合、多少コストがかかります。ただしLIKE、SQLのクエリも同様です。
エミリー

4
文字列の先頭にアンカーされていれば問題ありませんか?その後、クール。これは、^を追加する必要があることを意味します^
user4951 2012

44
私は正規表現iを追加しますjavascript db.users.find({ "name": { $regex: /m/i } })
Doron Segal 2015年

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 18
11:09

282

  • Pythonを使用したPyMongo
  • Node.jsを使用したMongoose
  • JongoJavaを使用
  • mgoGoを使用

できるよ:

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

2
大文字と小文字を区別する検索では問題なく機能しますが、大文字と小文字を区別しない検索を実行する方法を教えてください。
Tahir Yasin 2017年

次の正規表現は何ですか%sometext%
Tahir Yasin 2017年

64
:あなたはまだ迷っている場合@TahirYasin、大文字と小文字を区別しない検索は、次のように行われるだろうdb.users.find({'name': {'$regex': 'sometext', '$options': 'i'}})
sumowrestler

私は、golangで次のような単純なコードを使用してgolangで解決しました。selector:= bson.M {"technician":bson.M {"$ regex":tech}}
Sandun Priyanka

1
このような感じが受け入れられる答えになるはずです。それは現在最もシンプルで最もエレガントです。
Brett84c

88

PHPでは、次のコードを使用できます。

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

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

1
RegEx値がユーザー入力(フィルターフォームなど)に由来し、値自体をRegExpとして取得したくない場合は、preg_quote()を適用する必要があります。
Philipp Rieber 2013

2
私はこれに気づきましたが、これは実際には間違った答えですが、最適ではありませんが、代わりにMongoRegexを介して実際のBSON regexオブジェクトを使用する必要があります。$ regexには、$ inなどの特定のコマンドとの互換性の問題があります
Sammaye

この構文は、値が変数に格納されている場合に役立ちます。クエリは次のように記述できます(Rubyの場合):$collection.where(field => {"$regex" => value})
Donny Kurnia

しかし、なぜ配列リテラルを使用できないのでしょうか?
Alper 2016年

53

mongoでは、そのために正規表現を使用します。

例えば: 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

2つの選択肢があります。

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

または

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

2番目のオプションでは、大文字と小文字を区別せずに使用するオプションの「i」のような、より多くのオプションがあります。また、「文字列」については、「。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') } );

Rubyでの同様の構文:collection.where(field => Regexp.new(value))
Donny Kurnia 2014

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/...は、このヘルプん
The6thSense


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 2015年

@Rocketmonkeysは真実です。 "LIKE演算子"などの場合、$ regex mongo演算子を使用します。
cmarrero01 2015年

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

likeクエリはどのように使用できますか?私はこれを試しましたが機能しません:searchQuery.product_name = '/'+req.query.search.value+'/i';
Muhammad Shahzad

次のように試すことができますsearchQuery.product_name= {$regex: req.query.search.value, $options: 'i'};
。– Shaishab Roy 2016

あなたは私の命を救う。$ regexと$ optionsとは何ですか?
Muhammad Shahzad 2016年

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 2016年

$regex: 'value' 検索値の正規表現を適切に生成し、大文字と小文字を区別しない$options: 'i'ことを意味します。あなたが同じ別のプロパティの値と、その行為として使用するので、あなたのコードが働いていなかったし、自分のデータベースコレクションに満たしていなければならない条件を。
Shaishab Roy 2016

12

PHP mongo Likeの場合。
私はphp mongoのようないくつかの問題がありました。正規表現のparamsを連結すると、PHPのmongo findフィールドがで始まる状況で役立つことがわかりました。私はここに投稿して、より人気のあるスレッドに貢献することを考えました

例えば

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インデックスメソッドを実装することは可能ですか
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のドキュメントのデータセットを操作すると、パフォーマンスの違いが非常に顕著になります(これは控えめな表現です)
nivensookharan

1
実際、これ単語全体に対してのみ機能します。docs.mongodb.com/ manual / core / index
Thomas Ebertを

8

Goとmgoドライバー:

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

ここで、resultは、求められている型の構造体インスタンスです。


2
plsはリテラル内のキーのないフィールドを避け、bson:RegEx{Pattern:"m", Options:"i"}代わりに行う
bithavoc

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

javascript /regex_pattern/パターンとmongo {'$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 }
ジャンフランコP.

$ projectステージでは、何をしたいかをプロジェクトします
Vokail

4

文字列deepakparmar、dipak、parmar

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

ans deepakparmar

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

ans deepakparmar、dipak

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

ans deepakparmar、パルマー



2

MongoRegexは非推奨になりました。
MongoDB \ BSON \ Regexを使用

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

これはPHPのMongoRegexクラスを指すことに注意することが重要です。ノードに関するこの質問にはあまり関係ありません。これはおそらくコメントかそれ以上のはずです-別の投稿での自己回答の質問。
ボアズ-モニカ

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

文字列パターンを検索するときは、大文字と小文字が不明な場合と同様に、常に上記のパターンを使用することをお勧めします。お役に立てば幸いです!!!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.