MongoDB 正規表現($regex)とその例

⚡ スマートサマリー

MongoDB 正規表現は、$regex演算子、大文字小文字を区別しないための$optionsフラグ、完全一致のためのアンカー、および正確なフィールド値が不明な場合のスラッシュ区切り文字を使用して、ドキュメント内の文字列を検索するためにパターンマッチングを実行します。

  • 🔍 $ regex Operaトール: db.collection.find({field:{$regex:”pattern”}}) は、パターンを含むドキュメントに一致します。
  • 🎯 Anchors: ^ と $ は完全一致を強制し、パターンを文字列の開始位置と終了位置にバインドします。
  • 🔠 大文字小文字の区別なし: $options の「i」フラグは、大文字と小文字を区別せずにテキストに一致します。
  • スラッシュ区切り文字: ラップping /…/ 内のパターンは、$regex 演算子を記述せずに一致します。
  • 📉 直近のN件のドキュメント: sort({_id:-1})とlimit(n)を組み合わせて、最新のレコードを返します。
  • 🤖 AIアシスト: アシスタントは正規表現パターンを作成し、コレクション全体のスキャンによるパフォーマンスコストを特定します。

MongoDB 正規表現(Regex)

正規表現はパターンマッチングに使用され、これは基本的に文書内の文字列を検索するために使用されます。

コレクション内のドキュメントを取得するときに、検索する正確なフィールド値が正確にわからない場合があります。 したがって、正規表現を使用すると、パターン マッチング検索値に基づいたデータの取得を支援できます。

パターンマッチングに$regex演算子を使用する

$regex 演算子 MongoDB コレクション内の特定の文字列を検索するために使用されます。次の例は、これがどのように実行されるかを示しています。

フィールド名が「Employeeid」と「EmployeeName」である、同じ従業員コレクションがあると仮定します。また、コレクションには以下のドキュメントが含まれていると仮定します。

従業員ID 従業員名
22 ニューマーティン
2 モハン
3 ジョー
4 モハンR
100 Guru99
6

以下のコードでは、$regex演算子を使用して検索条件を指定しています。

$regex の使用 Operaパターンマッチング用のtor

db.Employee.find({EmployeeName : {$regex: "Gu" }}).forEach(printjson)

Code 説明:

  1. ここでは、「Gu」という文字を含むすべての従業員名を検索します。そのため、$regex演算子を使用して「Gu」という検索条件を定義します。
  2. printjson は、クエリによって返された各ドキュメントをより適切な方法で印刷するために使用されます。

コマンドが正常に実行されると、次の出力が表示されます。

出力:

$regex の使用 Operaパターンマッチング用のtor

出力には、従業員名に「Gu」文字が含まれるドキュメントが返されることが明確に示されています。

コレクションに以下の文書があり、従業員名が「Guru検索条件を「999」と入力した場合Guru99」という文字列を含む文書も返されます。Guru999」。しかし、もし私たちがこれを望まず、単に「999」というドキュメントを返したいだけだったらどうでしょう。Guru99」。次に、正確なパターンマッチングでこれを行うことができます。正確なパターンマッチングを行うには、^ と $ 文字を使用します。文字列の先頭に ^ 文字を追加し、文字列の末尾に $ を追加します。

従業員ID 従業員名
22 ニューマーティン
2 モハン
3 ジョー
4 モハンR
100 Guru99
6
8 Guru999

次の例は、これを実行する方法を示しています。

$regex の使用 Operaパターンマッチング用のtor

db.Employee.find({EmployeeName : {$regex: "^Guru99$"}}).forEach(printjson)

Code 説明:

  1. 検索条件では、^ と $ 文字を使用しています。^ は文字列が特定の文字で始まることを保証するために使用され、$ は文字列が特定の文字で終わることを保証するために使用されます。したがって、コードが実行されると、名前が「Guru99。 "
  2. printjson は、クエリによって返された各ドキュメントをより適切な方法で印刷するために使用されます。

コマンドが正常に実行されると、次の出力が表示されます。

出力:

$regex の使用 Operaパターンマッチング用のtor

出力では、文字列「Guru99”が取得されました。

$options を使用したパターン マッチング

$regex 演算子を使用する場合、以下のオプションを追加することもできます。 $ options キーワード。 たとえば、大文字と小文字が区別されるかどうかに関係なく、従業員名に「Gu」が含まれるすべてのドキュメントを検索したいとします。 そのような結果が必要な場合は、次を使用する必要があります。 $ options 大文字小文字を区別しないパラメータを使用。

次の例は、これを実行する方法を示しています。

「Employeeid」と「EmployeeName」というフィールド名を持つ、同じ従業員コレクションがあると仮定しましょう。

また、私たちのコレクションには以下の文書が含まれていると仮定しましょう。

従業員ID 従業員名
22 ニューマーティン
2 モハン
3 ジョー
4 モハンR
100 Guru99
6
7 達人99

さて、前回のトピックと同じクエリを実行しても、結果に「GURU99」を含むドキュメントは表示されません。このドキュメントが結果セットに含まれるようにするには、$options パラメータに「i」を追加する必要があります。

$options を使用したパターン マッチング

db.Employee.find({EmployeeName:{$regex: "Gu",$options:'i'}}).forEach(printjson)

Code 説明:

  1. 'i' パラメータ (大文字小文字を区別しないことを意味します) を指定した $o​​ptions は、'Gu' という文字が小文字でも大文字でも検索を実行することを指定します。

コマンドが正常に実行されると、次の出力が表示されます。

出力:

$options を使用したパターン マッチング

  1. 出力結果から明らかなように、ある文書に大文字の「Gu」が含まれていても、その文書は結果セットに表示されます。

正規表現演算子を使用しないパターンマッチング

正規表現演算子($regex)を使わずにパターンマッチングを行うこともできます。以下の例は、その方法を示しています。

正規表現を使用しないパターン マッチング Operaタ

db.Employee.find({EmployeeName: /Gu/}).forEach(printjson)

Code 説明:

  1. 「//」区切り文字は、基本的にこれらの区切り文字内で検索条件を指定することを意味します。したがって、従業員名に「Gu」が含まれる文書を検索するために、/Gu/ と指定しています。

コマンドが正常に実行されると、次の出力が表示されます。

出力:

正規表現を使用しないパターン マッチング Operaタ

出力には、従業員名に「Gu」文字が含まれるドキュメントが返されることが明確に示されています。

コレクションから最後の「n」個のドキュメントを取得する

コレクション内の最後の n 個のドキュメントを取得するには、さまざまな方法があります。

それでは、以下の手順を通して、その方法の一つを見ていきましょう。

次の例は、これを実行する方法を示しています。

「Employeeid」と「EmployeeName」というフィールド名を持つ、同じ従業員コレクションがあると仮定しましょう。

また、私たちのコレクションには以下の文書が含まれていると仮定しましょう。

従業員ID 従業員名
22 ニューマーティン
2 モハン
3 ジョー
4 モハンR
100 Guru99
6
7 達人99

コレクションから最後の n 個のドキュメントを取得する

db.Employee.find().sort({_id:-1}).limit(2).forEach(printjson)

Code 説明:

  1. ドキュメントをクエリする際は、ソート機能を使用して、コレクション内の_idフィールドの値に基づいてレコードを逆順に並べ替えます。-1は基本的に、ドキュメントを逆順(降順)に並べ替えることを意味し、最後のドキュメントが最初に表示されるようになります。
  2. 次に、limit句を使用して、表示したいレコード数だけを表示します。ここではlimit句(2)を設定しているので、最後の2つのドキュメントが取得されます。

コマンドが正常に実行されると、次の出力が表示されます。

出力:

コレクションから最後の n 個のドキュメントを取得する

出力には、コレクション内の最後の 2 つのドキュメントが表示されていることが明確に示されています。したがって、コレクション内の最後の 'n' 個のドキュメントを取得するには、まずドキュメントを降順で並べ替え、次に limit 句を使用して必要な 'n' 個のドキュメントを返すことができることが明確に示されています。

お願い注: 38,000 文字を超える文字列に対して検索を実行すると、正しい結果が表示されません。

よくあるご質問

Anchor ^ と $ のパターン。パターン “^Guru99$」は「Guru99」を拒否し、「Guru^ は文字列の先頭をバインドし、$ は文字列の末尾をバインドするため、「999」となります。

大文字小文字を区別するパターンで、^ 接頭辞が付いているものだけがインデックスを効率的に使用します。アンカーなしのパターンや大文字小文字を区別しないパターンはコレクション全体のスキャンをトリガーするため、可能な限り接頭辞をアンカーしてください。

ドット、アスタリスク、プラス記号、括弧などのメタ文字の前にはバックスラッシュを付けます。例えば、リテラルの「.com」の末尾のパターンでは、ドットがエスケープされるため、ドットは文字として扱われません。

$regex は、1 つのフィールドに対して柔軟なパターンマッチングを実行し、コレクション全体をスキャンできます。$text は、テキストインデックスを使用して、インデックス付きフィールド全体にわたる高速な単語ベースの検索を実行しますが、部分文字列パターンはサポートしていません。

はい。検索文字列が約38,000文字を超えると、クエリが正しい結果を返さない場合があります。信頼性の高いマッチングを行うには、パターンとターゲットフィールドをその制限内に収めてください。

大文字小文字を区別しない検索のためにフィールドの小文字のコピーを保存し、パターンを^で固定し、大規模なコレクションでは固定されていない$regexの代わりにテキストインデックスまたはAtlas Searchを優先します。

AIアシスタントは、平易な英語のルールを正規表現パターンに変換し、適切なアンカーとオプションフラグを追加し、クエリによって低速なフルコレクションスキャンが発生する場合に警告を発します。

はい。AIコパイロットは、アンカーのないパターンを書き換え、テキストインデックスまたはアトラス検索を推奨し、大文字小文字を区別しない正規表現を速度向上のために小文字のフィールド検索に変換します。