web-dev-qa-db-ja.com

MongoDBに "like"を使用してクエリする方法

私はSQLのlikeクエリで何かをクエリしたいです。

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

MongoDBで同じようにするにはどうすればいいですか? documentationlikeの演算子が見つかりません。

1239
Freewind

それはする必要があります:

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

または類似:

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

どこかに "m"が含まれているもの(SQLの '%'演算子はRegexpの '.*'に相当)を探しているのではなく、 "m"が文字列の先頭に固定されているものではありません。

1665
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'

アウト:ペドロ

299

  • PyMongo using Python
  • マングース using Node.js
  • Jongo Java を使用して
  • mgo Go を使用

できるよ:

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

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

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

あなたはそのために正規表現を使うことになるでしょう。

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

44
Joshua Partogi

すでにたくさんの答えがあります。正規表現を使用した文字列検索のためのさまざまな種類の要件と解決策を示しています。

あなたはWordを含む正規表現でそれをすることができますすなわち好きです。大文字と小文字を区別しない検索にも$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'}})

これ をブックマークとして保管し、必要に応じてその他の変更を加えてください。

38
Somnath Muluk

node.js を使用すると、 it と書くことができます。

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

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

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

または

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

2番目に、大文字と小文字を区別しない使用を見つけるためのオプションの "i"のように、より多くのオプションがあります。そして "string"については、例えば ". string。 "(%string%)、または "string。*"(string%)と "。* string)(%string)のように使えます。あなたが望むように正規表現を使用することができます。

楽しい!

22
user3645907

すでに正解を得ましたが、正規表現を大文字と小文字を区別しません。

あなたは次のクエリを使用することができます

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

/m/iiは大文字と小文字を区別しないことを示し、.pretty()はよりきれいな出力を提供します

17
The6thSense

Node.jsのマングース用

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

PHP mongoが好きです。
php mongoにはいくつかの問題があります。正規表現のパラメータを連結すると、状況によっては役に立つことがわかりました 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)
11
Dap

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

nodejs projectでmongoose use query同様を使用します。

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);
            });
9
Shaishab Roy

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構造を生成するすべての場所で使います。

8
MAA

MongoDB Compassでは、次のように厳密モードの構文を使用する必要があります。

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

(MongoDB Compassでは、"の代わりに'を使うことが重要です)

7
damd

以下のように一致する正規表現を使用してください。 '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);
7
Shalabh Raizada

囲碁とmgoドライバの場合:

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

ここでresultは求められた型の構造体インスタンスです

7
user2312578

Where文を使用して任意のJSスクリプトを作成できます。

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

参照: http://docs.mongodb.org/manual/reference/operator/where/

7
Crasher

正規表現は高価ですプロセスです。

もう1つの方法は、テキストの索引を作成してから$searchを使用してそれを検索することです。

検索可能にしたいフィールドのテキストインデックスを作成します。

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

テキストインデックスで文字列を検索します。

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

クエリは以下のようになります。

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]
5
prayagupd

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" }
4
Bruno Bronosky

Spring-Data Mongodbを使用している場合これを次のようにして実行できます。

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

Mongo Shellが正規表現をサポートしているので、それは完全に可能です。

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

クエリで大文字と小文字を区別しない場合は、次のように "i"オプションを使用できます。

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

あなたがmongoで「いいね」の検索をしたいのなら、このクエリを使って$ regexで行くべきです。

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

より多くのためにあなたは同様にドキュメンテーションを読むことができます。 https://docs.mongodb.com/manual/reference/operator/query/regex/

4
jarry jafery

私はMYSQLクエリをMongoDBに翻訳するための無料ツールを見つけました。 http://www.querymongo.com/ /私はいくつかの質問で調べた。私が見るようにほとんどすべてが正しいです。それによると、答えは

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

集約サブストリング検索を使用します(索引は!!!)。

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

変数でテンプレートリテラルを使うこともできます:

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

2
besthost

MongoRegexは廃止予定です。
MongoDB\BSON\Regexを使用

$regex = new MongoDB\BSON\Regex ( '^m');
$cursor = $collection->find(array('users' => $regex));
//iterate through the cursor
2
Albert s
db.customer.find({"customerid": {"$regex": "CU_00000*", "$options": "i"}}).pretty()

文字列パターンを検索するときは、大文字と小文字の区別がわからないときに常に上記のパターンを使用することをお勧めします。それが役立つことを願っています!

1
priya raj

2つの日付の間のステータス==「保留中」の「last」のようなフルネーム:

db.orders.find({
      createdAt:{$gt:ISODate("2017-04-25T10:08:16.111Z"),
      $lt:ISODate("2017-05-05T10:08:16.111Z")},
      status:"Pending",
      fullName:/last/}).pretty();

status == 'Pending'およびorderIdのように 'PHA876174':

db.orders.find({
     status:"Pending",
     orderId:/PHA876174/
     }).pretty();
1
Shubham Verma
>> db.car.distinct('name')
[ "honda", "tat", "tata", "tata3" ]

>> db.car.find({"name":/. *ta.* /})
0
arnav

次のようにワイルドカードフィルタを使用することもできます。

{"query": { "wildcard": {"lookup_field":"search_string*"}}}

必ず*を使用してください。

0
saim2025

String 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、dipak、parmar

0
Deepak parmar

PHPを使用している場合は、以下のように MongoDB_DataObject wrapperを使用できます。

$model = new MongoDB_DataObject();

$model->query("select * from users where name like '%m%'");

while($model->fetch()) {
    var_dump($model);
}

または:

$model = new MongoDB_DataObject('users);

$model->whereAdd("name like '%m%'");

$model->find();

while($model->fetch()) {
    var_dump($model);
}
0
CEDA