MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

PyMongoで正規表現クエリを実行する方法をわかりやすく解説

PyMongoは、PythonからMongoDBを操作するためのツール群を含むディストリビューションです。PyMongo(およびMongoDBシェル)を使えば、正規表現を活用した柔軟なドキュメント検索が可能になります。本記事では、正規表現クエリの基本的な構文から、実際のサンプルコードとその実行結果まで、順を追って解説します。

正規表現クエリの基本構文

MongoDBで正規表現による検索を行うには、$regex 演算子を使用します。基本的な構文は以下の通りです。

db.yourCollectionName.find({'yourFieldName': {'$regex': '^yourWords'}}).pretty()

この構文では、指定したフィールドの値が特定の単語で始まる(^ が行頭を表す)ドキュメントをすべて取得できます。たとえば、配列型のフィールドに対して正規表現を適用した場合、配列内のいずれかの要素が条件に一致すれば、そのドキュメントが検索結果として返されます。

サンプルデータの準備

実際に正規表現クエリを試すために、まずコレクションにドキュメントを挿入してみましょう。以下のクエリでは、performRegex というコレクションに2件のドキュメントを作成しています。

> db.performRegex.insertOne({"ClientName":"Larry","ClientFolderInformation":["Folder 1","Folder 2","Folder 3","Folder 4","Folder 5"], "MainFolderLocation":"/MainFolder/Details/ClientFolder"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c8a8b186cea1f28b7aa07f2")
}
> db.performRegex.insertOne({"ClientName":"Larry","ClientFolderInformation":["ClientFolder 1","ClientFolder 2","ClientFolder 3","ClientFolder 4","ClientFolder 5"], "MainFolderLocation":"/MainFolder/Details/ClientFolder"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c8a8b1d6cea1f28b7aa07f3")
}

2件のドキュメントはどちらも ClientName が「Larry」で共通していますが、ClientFolderInformation フィールドの内容が異なります。1件目は「Folder 1」〜「Folder 5」、2件目は「ClientFolder 1」〜「ClientFolder 5」という値を持っています。

登録済みドキュメントの確認

find() メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。

> db.performRegex.find().pretty()

実行結果は以下の通りです。

{
    "_id" : ObjectId("5c8a8b186cea1f28b7aa07f2"),
    "ClientName" : "Larry",
    "ClientFolderInformation" : [
        "Folder 1",
        "Folder 2",
        "Folder 3",
        "Folder 4",
        "Folder 5"
    ],
    "MainFolderLocation" : "/MainFolder/Details/ClientFolder"
}
{
    "_id" : ObjectId("5c8a8b1d6cea1f28b7aa07f3"),
    "ClientName" : "Larry",
    "ClientFolderInformation" : [
        "ClientFolder 1",
        "ClientFolder 2",
        "ClientFolder 3",
        "ClientFolder 4",
        "ClientFolder 5"
    ],
    "MainFolderLocation" : "/MainFolder/Details/ClientFolder"
}

正規表現クエリの実行例

それでは、実際に正規表現を使った検索を実行してみましょう。ここでは2つのケースを紹介します。

ケース1:「ClientFolder」で始まるドキュメントを検索

以下のクエリは、ClientFolderInformation フィールドの値が「ClientFolder」という単語で始まるドキュメントをすべて取得します。

> db.performRegex.find({'ClientFolderInformation':{'$regex':'^ClientFolder'}}).pretty()

実行結果は以下の通りです。

{
    "_id" : ObjectId("5c8a8b1d6cea1f28b7aa07f3"),
    "ClientName" : "Larry",
    "ClientFolderInformation" : [
        "ClientFolder 1",
        "ClientFolder 2",
        "ClientFolder 3",
        "ClientFolder 4",
        "ClientFolder 5"
    ],
    "MainFolderLocation" : "/MainFolder/Details/ClientFolder"
}

「ClientFolder 1」〜「ClientFolder 5」を含むドキュメントのみが返され、「Folder 1」〜「Folder 5」を含むドキュメントは除外されていることがわかります。

ケース2:「Folder」で始まるドキュメントを検索

次に、検索条件を「Folder」で始まる値に変更してみます。

> db.performRegex.find({'ClientFolderInformation':{'$regex':'^Folder'}}).pretty()

実行結果は以下の通りです。

{
    "_id" : ObjectId("5c8a8b186cea1f28b7aa07f2"),
    "ClientName" : "Larry",
    "ClientFolderInformation" : [
        "Folder 1",
        "Folder 2",
        "Folder 3",
        "Folder 4",
        "Folder 5"
    ],
    "MainFolderLocation" : "/MainFolder/Details/ClientFolder"
}

今度は「Folder 1」〜「Folder 5」を含むドキュメントのみが返されました。

まとめ

MongoDBの $regex 演算子を使うことで、フィールド値の先頭一致や部分一致など、柔軟なパターン検索が実現できます。配列フィールドに対しても正規表現を適用できるため、フォルダ名やタグなど、複数の値を持つデータの絞り込みに非常に便利です。PyMongoからPythonコードで実行する場合も、同様に collection.find({'フィールド名': {'$regex': 'パターン'}}) の形式でクエリを記述できます。なお、大文字小文字を区別しない検索には $options: 'i' を組み合わせることもできるので、用途に応じて活用してみてください。

  1. CSSのメディアクエリを活用したレスポンシブWebデザインの基本と実装例

    メディアクエリとは メディアクエリ(Media Queries)は、CSSで提供される技術の一つで、スマートフォン、タブレット、デスクトップPCなど、デバイスの画面サイズに応じて異なるスタイルルールを適用できる仕組みです。 これにより、単一のHTMLファイルであらゆる画面幅に対応したレスポンシブWebデザインを実現できます。ブレークポイント(画面幅の境界値)ごとに条件を指定し、その条件が一致した場合のみCSSが適用されるのが特徴です。 主な構文のポイント @media only screen and (max-width: 600px) … 幅600px以下の画面に適用 @media onl

  2. Macでパスワードを使ってフォルダーを暗号化する方法【ディスクユーティリティ・ターミナル対応】

    パソコン上のフォルダーを暗号化する方法を知っておくと、プライベートなデータにさらなるセキュリティ層を追加できます。他人に見られたくないファイルを守りたい場面で特に役立ちます。しかし、macOSではフォルダーを右クリックしても「パスワード保護」という項目は表示されません。標準機能としてフォルダーに直接パスワードをかける仕組みが用意されていないため、保護されたフォルダーを自分で作成する必要があります。 では、Macのフォルダーにパスワードを設定するにはどうすればよいのでしょうか? 最も基本的な方法は、macOSに標準搭載されている「ディスクユーティリティ」を使って暗号化ディスクイメージを作成するこ