MongoDBで正規表現を使って配列(Array[String])をクエリする方法
MongoDBでは、配列内の文字列に対して正規表現(regexp)で一致する要素を検索できます。通常のフィールドと同じように、正規表現パターンをクエリ条件として指定するだけで、配列のいずれかの要素がパターンに一致するドキュメントを取得できます。
基本構文
配列の文字列を正規表現で照合してクエリするには、次の構文を使用します。
db.yourCollectionName.find( { yourFieldName: /yourStartingValue./ } ).pretty();それでは、実際にサンプルコレクションを作成しながら手順を見ていきましょう。
サンプルドキュメントを持つコレクションを作成する
まず、insertOne()メソッドを使ってドキュメントを挿入し、コレクションを作成します。ここでは、学生の氏名を配列で保持する「queryArrayDemo」コレクションを使用します。
> db.queryArrayDemo.insertOne({"StudentFullName":["Carol Taylor","Caroline Williams","Claire Brown"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ca2774c6304881c5ce84ba0")
}
> db.queryArrayDemo.insertOne({"StudentFullName":["John Smith","Jace Doe","Jabin Brown"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ca277b36304881c5ce84ba1")
}登録済みの全ドキュメントを表示する
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.queryArrayDemo.find().pretty();
このクエリを実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5ca2774c6304881c5ce84ba0"),
"StudentFullName" : [
"Carol Taylor",
"Caroline Williams",
"Claire Brown"
]
}
{
"_id" : ObjectId("5ca277b36304881c5ce84ba1"),
"StudentFullName" : [
"John Smith",
"Jace Doe",
"Jabin Brown"
]
}正規表現で配列の文字列をクエリする
ここからが本題です。配列内の文字列に対して正規表現で一致を検索するには、次のようにクエリを記述します。この例では、「J」で始まる名前を含むドキュメントを検索しています。
> db.queryArrayDemo.find( { StudentFullName : /J./ } ).pretty();実行結果は以下のとおりです。「John Smith」「Jace Doe」「Jabin Brown」という「J」で始まる要素を含むドキュメントのみが返されていることがわかります。
{
"_id" : ObjectId("5ca277b36304881c5ce84ba1"),
"StudentFullName" : [
"John Smith",
"Jace Doe",
"Jabin Brown"
]
}ポイントまとめ
- 配列フィールドに対して正規表現を指定すると、配列内のいずれかの要素がパターンに一致すれば、そのドキュメントがマッチします。
- 正規表現は
/パターン/の形式で直接記述できるほか、$regex演算子を使って{ yourFieldName: { $regex: "^J" } }のように指定することも可能です。 - 前方一致で検索したい場合は
/^J/のようにキャレット(^)を付けると、より効率的かつ意図通りの検索ができます。
-
【Python】正規表現でファイル拡張子に一致させる方法
正規表現を使うと、ファイル名の中から特定の拡張子を簡単に抽出できます。以下のコードでは、re.search() を使って、指定されたファイル名が .doc という拡張子で終わっているかどうかを判定しています。例import re result = re.search(.doc$, 87654_3.doc) print(result.group())出力このコードを実行すると、次の出力が得られます。.doc解説パターン内の $ は「文字列の末尾」を意味するアンカー(メタ文字)です。これにより、ファイル名の途中に含まれる .doc ではなく、名前の最後に付いた拡張子だけが確実に一致します。また、g
-
【Python】正規表現を使って文字列内の単語をマッチ・抽出する方法
次のコードは、指定された文字列の中から「meeting」という単語を抽出します。ここでは肯定の先読み(look-ahead)と肯定の後読み(look-behind)アサーションを使用しています。これにより、単語を囲む文字の存在を条件として考慮しつつ、その文字自体はマッチ結果に含めないようにできます。コード例import re s = https://www.google.com/meeting_agenda_minutes.html result = re.findall(r(?<=[\W_])meeting(?=[\W_]), s) print(result)出力[meeting]パ