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' を組み合わせることもできるので、用途に応じて活用してみてください。
-
CSSのメディアクエリを活用したレスポンシブWebデザインの基本と実装例
メディアクエリとは メディアクエリ(Media Queries)は、CSSで提供される技術の一つで、スマートフォン、タブレット、デスクトップPCなど、デバイスの画面サイズに応じて異なるスタイルルールを適用できる仕組みです。 これにより、単一のHTMLファイルであらゆる画面幅に対応したレスポンシブWebデザインを実現できます。ブレークポイント(画面幅の境界値)ごとに条件を指定し、その条件が一致した場合のみCSSが適用されるのが特徴です。 主な構文のポイント @media only screen and (max-width: 600px) … 幅600px以下の画面に適用 @media onl
-
Macでパスワードを使ってフォルダーを暗号化する方法【ディスクユーティリティ・ターミナル対応】
パソコン上のフォルダーを暗号化する方法を知っておくと、プライベートなデータにさらなるセキュリティ層を追加できます。他人に見られたくないファイルを守りたい場面で特に役立ちます。しかし、macOSではフォルダーを右クリックしても「パスワード保護」という項目は表示されません。標準機能としてフォルダーに直接パスワードをかける仕組みが用意されていないため、保護されたフォルダーを自分で作成する必要があります。 では、Macのフォルダーにパスワードを設定するにはどうすればよいのでしょうか? 最も基本的な方法は、macOSに標準搭載されている「ディスクユーティリティ」を使って暗号化ディスクイメージを作成するこ