MongoDBのフィールド値を$regexのパターンとして使用することは可能ですか?
はい、可能です。そのためには、アグリゲーションフレームワークと $indexOfCP 演算子を組み合わせて使用します。まず、サンプルとなるドキュメントを含むコレクションを作成しましょう。
> db.patterDemo.insertOne(
{
"ClientName": "John", "ClientWebsiteName":"webbuziness.com/John/business"
}
);
{
"acknowledged" : true,
"insertedId" : ObjectId("5cea40acef71edecf6a1f68d")
}
> db.patterDemo.insertOne(
{
"ClientName": "Carol", "ClientWebsiteName":"solvecoding.com/business"
}
);
{
"acknowledged" : true,
"insertedId" : ObjectId("5cea40acef71edecf6a1f68e")
}find() メソッドを使って、コレクション内のすべてのドキュメントを表示するクエリは以下のとおりです。
> db.patterDemo.find().pretty();
上記のクエリを実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5cea40acef71edecf6a1f68d"),
"ClientName" : "John",
"ClientWebsiteName" : "webbuziness.com/John/business"
}
{
"_id" : ObjectId("5cea40acef71edecf6a1f68e"),
"ClientName" : "Carol",
"ClientWebsiteName" : "solvecoding.com/business"
}続いて、フィールド値をパターンとして利用して部分一致を判定するクエリを見てみましょう。ポイントは、$expr の中で $indexOfCP を使い、「ClientWebsiteName」の中に「ClientName」が含まれているかどうかをチェックする点です。
> db.patterDemo.aggregate([ { "$match": { "$expr": { "$ne": [ { "$indexOfCP": ["$ClientWebsiteName", "$ClientName"] }, -1 ] } }} ]);このクエリを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5cea40acef71edecf6a1f68d"), "ClientName" : "John", "ClientWebsiteName" : "webbuziness.com/John/business" }仕組みの解説
このクエリでは、$match ステージ内の $expr を使って、集計式による比較を行っています。$indexOfCP は、第1引数の文字列(ここでは ClientWebsiteName)の中から、第2引数の文字列(ClientName)を検索する演算子です。
- 文字列が見つかった場合 → 開始位置のインデックス(0以上の数値)を返す
- 文字列が見つからなかった場合 →
-1を返す
したがって、$ne: [ ..., -1 ] という条件は「ClientName が ClientWebsiteName に含まれているドキュメントのみを取得する」という意味になります。結果として、ウェブサイトURLに自分の名前が含まれている「John」のドキュメントだけがマッチしました。
補足:$regexMatch を使う方法
MongoDB 4.2 以降では、$regexMatch 演算子を使うことで、より正規表現らしい柔軟なパターンマッチングも可能です。$expr 内で次のように記述すれば、フィールド値を直接パターンとして渡せます。
{ "$match": { "$expr": { "$regexMatch": { "input": "$ClientWebsiteName", "regex": "$ClientName" } } } }単純な部分一致なら $indexOfCP、大文字小文字の無視やアンカー指定など正規表現オプションが必要な場合は $regexMatch を選ぶとよいでしょう。
-
【MongoDB】idがドキュメント内の配列フィールドの値と一致する場合に除外するクエリの書き方
MongoDBでは、ドキュメントの id フィールドの値が、同一ドキュメント内の配列型フィールド(例: subjectid)に含まれている場合に、そのドキュメントを検索結果から除外したいケースがあります。このような条件を実現するには、 $expr 演算子と組み合わせて $not および $in を使用します。本記事では、サンプルコレクションの作成からクエリの実行、出力結果の確認までを順を追って解説します。 サンプルコレクションの作成 まずは、動作確認用のドキュメントを含むコレクションを作成します。ここでは、 id フィールドと、文字列の配列を持つ subjectid フィールドを備えた2件のド
-
MongoDBの_idフィールドを非表示にする方法
MongoDBの_idフィールドを非表示にする方法MongoDBでは、find()メソッドでドキュメントを検索すると、デフォルトで_idフィールド(ObjectId)が必ず結果に含まれます。しかし、射影(プロジェクション)という仕組みを使えば、この_idフィールドを非表示にし、必要なフィールドだけを取得することが可能です。本記事では、具体的な手順をサンプルコード付きで解説します。1. コレクションとドキュメントの作成まず、サンプル用のコレクションを作成し、ドキュメントを挿入します。> db.demo575.insertOne({id:101, Information:{Name:&quo