1720

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

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

MongoDBで同じことをどのように達成できますか?ドキュメントlikeにの演算子が見つかりません。

4

45 に答える 45

2314

それは次のようにする必要があります:

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

または類似:

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

文字列の先頭に「m」が固定されているものではなく、どこかに「m」が含まれているもの(SQLの' %'演算子は正規表現'''と同等)を探しています。.*

注: MongoDBは、SQLの「LIKE」よりも強力な正規表現を使用します。正規表現を使用すると、想像する任意のパターンを作成できます。

正規表現の詳細については、正規表現(MDN)を参照してください。

于 2010-07-22T03:57:50.930 に答える
490
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'

出力:ペドロ

于 2014-05-20T13:26:31.670 に答える
348

  • Pythonを使用したPyMongo
  • Node.jsを使用したマングース
  • JongoJavaを使用
  • mgoGoを使用

できるよ:

db.users.find({'name': {'$regex': 'sometext'}})
于 2012-10-07T17:07:24.447 に答える
100

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

$collection->find(array('name'=> array('$regex' => 'm'));
于 2011-05-13T08:36:20.157 に答える
82

正規表現を使用した文字列検索のさまざまなタイプの要件とソリューションを次に示します。

たとえば、のような単語を含む正規表現を使用できます。また$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'}})

正規表現のチートシートをブックマークとして保持し、必要になる可能性のあるその他の変更の参照として使用します。

于 2016-08-11T15:39:09.747 に答える
61

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

例えば、

db.users.find({"name": /^m/})
于 2010-07-22T03:48:56.307 に答える
47

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

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

また

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

2つ目は、大文字と小文字を区別せずに検索するオプションの「i」など、より多くのオプションがあります。

また、「文字列」については、「。string。」(%string%)、「string。*」(文字列%)、「。* string)(%string)などを使用できます。通常の文字列を使用できます。あなたが望むように表現。

于 2017-04-26T02:48:04.293 に答える
41

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') } );
于 2014-03-09T06:11:58.300 に答える
27

すでに答えは得られていますが、大文字と小文字を区別しない正規表現と一致させるには、次のクエリを使用できます。

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

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

于 2014-11-21T05:39:14.720 に答える
21

Node.jsのMongooseの場合:

db.users.find({'name': {'$regex': '.*sometext.*'}})
于 2015-11-10T11:39:29.137 に答える
14

MongoDB2.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"
    }
});
于 2014-08-04T19:19:03.827 に答える
14

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);
            });
于 2015-08-11T09:47:18.840 に答える
13

whereステートメントを使用して、JavaScriptスクリプトを作成できます。

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

参照:$ where

于 2013-09-05T14:53:27.940 に答える
13

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

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

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

于 2017-04-19T08:01:35.243 に答える
12

Goとmgoドライバーの場合:

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

ここで、結果は、求められている型のstructインスタンスです。

于 2014-03-17T21:50:16.277 に答える
12

PHPモンゴのように

PHPmongoでいくつかの問題が発生しまし。正規表現パラメーターを連結すると、状況によっては役立つことがわかりました。PHPmongoの検索フィールドは。で始まります

例えば、

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)
于 2014-09-17T20:20:45.230 に答える
12

変数でテンプレートリテラルを使用することも機能します。

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

于 2018-06-08T06:43:22.590 に答える
11

SQLでは、「<strong>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構造を生成します。

于 2014-03-19T11:09:45.720 に答える
10

正規表現の処理にはコストがかかります。

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

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

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

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

db.collection.find({
  '$text'=>{'$search': "The string"}
})
于 2018-05-16T05:59:08.113 に答える
9

文字列yourdb={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、parmar

于 2019-07-30T11:22:00.623 に答える
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);
于 2015-12-11T07:35:49.040 に答える
7

/regex_pattern/JavaScriptパターンとMongoDBパターンの両方を使用する理由があるようです{'$regex': 'regex_pattern'}。参照:MongoDBRegEx構文の制限

これは完全な正規表現のチュートリアルではありませんが、上記の非常に投票されたあいまいな投稿を見て、これらのテストを実行するように促されました。

> ['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" }
于 2017-01-10T19:39:22.100 に答える
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]
于 2015-05-18T09:55:15.940 に答える
5

Spring-Data MongoDBを使用している場合は、次の方法で実行できます。

String tagName = "m";
Query query = new Query();
query.limit(10);
query.addCriteria(Criteria.where("tagName").regex(tagName));
于 2015-04-28T10:34:23.143 に答える
5

文字列変数がある場合は、それを正規表現に変換する必要があるため、MongoDBはそれに同様のステートメントを使用します。

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

次と同じ結果です:

db.users.find({"name": /John/})
于 2020-05-26T15:06:27.473 に答える
4

MongoDBシェルは正規表現をサポートしているため、それは完全に可能です。

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

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

db.users.findOne({"name" : /.*sometext.*/i});
于 2016-01-19T08:09:23.303 に答える
4

MongoDBで「like」検索が必要な場合は、$regexを使用する必要があります。これを使用すると、クエリは次のようになります。

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

詳細については、ドキュメントも読むことができます- $ regex

于 2016-08-23T15:03:51.460 に答える
4

集計部分文字列検索を使用します(インデックス付き!!!):

db.collection.aggregate([{
        $project : {
            fieldExists : {
                $indexOfBytes : ['$field', 'string']
            }
        }
    }, {
        $match : {
            fieldExists : {
                $gt : -1
            }
        }
    }, {
        $limit : 5
    }
]);
于 2018-01-03T19:16:55.383 に答える
3

MongoRegexは非推奨になりました。

MongoDB \ BSON\Regexを使用します。

$regex = new MongoDB\BSON\Regex ( '^m');
$cursor = $collection->find(array('users' => $regex));
//iterate through the cursor
于 2017-01-27T20:06:51.047 に答える
3

使用する:

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

文字列パターンを検索するときは、大文字と小文字がわからない場合と同様に、上記のパターンを使用することをお勧めします。

于 2017-06-02T06:06:13.790 に答える
3

正規表現でクエリできます。

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") });
于 2020-03-31T18:17:05.200 に答える
3

同様のクエリと同等の結果を見つける1つの方法:

db.collection.find({name:{'$regex' : 'string', '$options' : 'i'}})

i大文字と小文字を区別しないフェッチデータに使用される場所。

結果を得る別の方法:

db.collection.find({"name":/aus/})

上記は、ausを含む名前にausを含む結果を提供します。

于 2020-08-20T09:57:15.330 に答える
3

使用する:

const indexSearch = await UserModel.find(
      { $text: { $search: filter } },
    );

    if (indexSearch.length) {
      return indexSearch;
    }
    return UserModel.find(
      {
        $or: [
          { firstName: { $regex: `^${filter}`, $options: 'i' } },
          { lastName: { $regex: `^${filter}`, $options: 'i' } },
          { middleName: { $regex: `^${filter}`, $options: 'i' } },
          { email: { $regex: `^${filter}`, $options: 'i' } },
        ],
      },
    );

正規表現と「インデックス」を組み合わせて使用​​しました。

于 2021-03-08T19:42:41.413 に答える
2

MySQLクエリをMongoDBに変換するための無料のツールを見つけました: http ://www.querymongo.com/

いくつかのクエリで確認しました。私が見ているように、それらのほとんどすべてが正しいです。それによると、答えは

db.users.find({
    "name": "%m%"
});
于 2016-12-06T05:07:03.113 に答える
2

これを実現するにはさまざまな方法があります。

最も単純なもの:

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

{ <field>: { $regex: /pattern/, $options: '<options>' } }
{ <field>: { $regex: 'pattern', $options: '<options>' } }
{ <field>: { $regex: /pattern/<options> } }

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

詳細については、$regexを参照してください。

于 2020-07-23T03:47:13.500 に答える
2

JavaScript正規表現の使用

  • name文字列をスペースで分割し、単語の配列を作成します
  • 反復ループにマップし、文字列を名前の各単語の正規表現に変換します

let name = "My Name".split(" ").map(n => new RegExp(n));
console.log(name);

結果:

[/My/, /Name/]

文字列に一致するシナリオは2つあります。

  1. $in:(状態 に似てい$orます)

式で$を試してください。クエリ式に正規表現を含めるには、$inJavaScriptの正規表現オブジェクト(つまり、/pattern/)のみを使用できます。例えば:

db.users.find({ name: { $in: name } }); // name = [/My/, /Name/]
  1. $all:(条件 に似てい$andます)ドキュメントにはすべての単語が含まれている必要があります
db.users.find({ name: { $all: name } }); // name = [/My/, /Name/]

ネストされた条件$and$or条件を使用して$regex

文字列に一致するシナリオは2つあります。

  1. $or:(状態 に似てい$inます)
db.users.find({
  $or: [
    { name: { $regex: "My" } },
    { name: { $regex: "Name" } }
    // if you have multiple fields for search then repeat same block
  ]
})

遊び場

  1. $and:(条件 に似てい$allます)ドキュメントにはすべての単語が含まれている必要があります
db.users.find({
  $and: [
    {
      $and: [
        { name: { $regex: "My" } },
        { name: { $regex: "Name" } }
      ]
    }
    // if you have multiple fields for search then repeat same block
  ]
})

遊び場

于 2021-02-27T09:24:59.970 に答える
1

PHPを使用している場合は、次のようにMongoDB_DataObjectラッパーを使用できます。

$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);
}
于 2017-02-16T08:34:08.230 に答える
1

2つの日付の間にstatus=='Pending'がある'last'のようなFullName:

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'およびorderIdLIKE'PHA876174':

db.orders.find({
     status:"Pending",
     orderId:/PHA876174/
     }).pretty();
于 2017-05-06T08:38:57.123 に答える
1

Goドライバーの場合:

filter := bson.M{
    "field_name": primitive.Regex{
        Pattern: keyword,
        Options: "",
    },
}
cursor, err := GetCollection().Find(ctx, filter)

$ inクエリで正規表現を使用します(MongoDBドキュメント:$ in):

filter := bson.M{
    "field_name": bson.M{
        "$in": []primitive.Regex{
            {
                Pattern: keyword,
                Options: "",
            },
        }
    }
}
cursor, err := GetCollection().Find(ctx, filter)
于 2021-03-09T06:54:17.263 に答える
1

MongoDbでは、 MongoDb参照演算子の正規表現(regex)を使用するのと同じように使用できます。

同じ例の場合

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

MongoDb

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

    2) db.users.find({ "name": { $regex: new RegExp("m", 'i') } })

    3) db.users.find({ "name": { $regex:/m/i } })

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

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

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

MongoDb Any of Above with /^String/

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

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

MongoDb Any of Above with /String$/

    7) db.users.find({ "name": /m$/ })
于 2022-02-16T04:12:37.023 に答える
0
>> db.car.distinct('name')
[ "honda", "tat", "tata", "tata3" ]

>> db.car.find({"name":/. *ta.* /})
于 2017-10-15T06:14:22.630 に答える
0

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

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

必ず使用してください*

于 2018-07-07T10:34:27.177 に答える
0

「startswith」パラダイムを使用するコマンドは次のとおりです。

db.customer.find({"customer_name" : { $regex : /^startswith/ }})
于 2020-04-23T12:26:12.440 に答える
0

念のため、誰かが文字列の代わりに文字列の配列を保持するキーのSQLLIKEの種類のクエリを探しています。これは次のとおりです。

db.users.find({"name": {$in: [/.*m.*/]}})
于 2021-01-14T13:58:32.933 に答える
0

以前の回答は、コアMongoDBクエリに関する質問に完全に答えています。ただし、次のようなパターンベースの検索クエリを使用する場合:

{"keywords":{"$ regex":"^toron。*"}}

また

{"keywords":{"$ regex": "^ toron"}}

@Queryアノテーションを使用したSpringBootJPAリポジトリクエリでは、次のようなクエリを使用します。

@Query(value = "{ keyword : { $regex : ?0 }  }")
List<SomeResponse> findByKeywordContainingRegex(String keyword);

そして、呼び出しは次のいずれかである必要があります。

List<SomeResponse> someResponseList =    someRepository.findByKeywordsContainingRegex("^toron");

List<SomeResponse> someResponseList =    someRepository.findByKeywordsContainingRegex("^toron.*");

ただし、使用しないでください。

List<SomeResponse> someResponseList = someRepository.findByKeywordsContainingRegex("/^toron/");

List<SomeResponse> someResponseList =someRepository.findByKeywordsContainingRegex("/^toron.*/");

注意すべき重要なポイント @Queryステートメントの?0フィールドが二重引用符で囲まれた文字列に置き換えられるたびに。したがって、これらの場合、フォワードスラッシュ(/)は使用しないでください。検索パターンでは常に二重引用符を使用してパターンを探してください!! たとえば、"^toron" or "^toron.*"/^toron/ or /^toron.*/

于 2021-02-10T21:42:25.557 に答える