MongoDBのフィールド値を$regexのパターンとして使用することは可能ですか?
MongoDBの$regex演算子には、クエリ実行時に他のフィールドの値を直接パターンとして渡すことができません。しかし、集計パイプライン(aggregate)で$exprと$indexOfCP演算子を組み合わせることで、フィールド値を使った文字列マッチングを実現できます。
$indexOfCPは、第1引数の文字列の中で第2引数の文字列が最初に出現する位置(コードポイント単位)を返し、見つからない場合は-1を返します。この性質を利用して、あるフィールドの値が別のフィールドに含まれているかどうかを判定します。
サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成します。
> db.demo88.insertOne(
... {
... "Name": "Chris",
... "PassoutYear": "2020",
... "websiteName": "chris.shop.com/Carol-2020-"
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e2c14c471bf0181ecc422b1")
}
> db.demo88.insertOne(
... {
... "Name": "David",
... "PassoutYear": "2010",
... "websiteName": "david.bigshop.com/David-2010-"
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e2c14c571bf0181ecc422b2")
}
登録済みドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示します。
> db.demo88.find();
上記のコマンドを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e2c14c471bf0181ecc422b1"), "Name" : "Chris", "PassoutYear" : "2020", "websiteName" : "chris.shop.com/Carol-2020-" }
{ "_id" : ObjectId("5e2c14c571bf0181ecc422b2"), "Name" : "David", "PassoutYear" : "2010", "websiteName" : "david.bigshop.com/David-2010-" }フィールド値をパターンとして検索するクエリ
以下のクエリでは、websiteNameフィールドの値の中にNameフィールドの値が出現するかどうかを判定しています。
> db.demo88.aggregate([ { "$match": { "$expr": { "$ne": [ { "$indexOfCP": ["$websiteName", "$Name"] }, -1 ] } }} ])このクエリを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e2c14c571bf0181ecc422b2"), "Name" : "David", "PassoutYear" : "2010", "websiteName" : "david.bigshop.com/David-2010-" }結果の解説
出力を見ると、「David」というNameを持つドキュメントだけが返されていることがわかります。これは、DavidのwebsiteName「david.bigshop.com/David-2010-」の中に「David」という文字列が含まれており、$indexOfCPが出現位置を返したためです。
一方、Chrisのドキュメントでは、websiteName「chris.shop.com/Carol-2020-」の中に「Chris」という文字列が存在しないため、$indexOfCPが-1を返し、$ne(等しくない)条件によって除外されました。
このように、$regexの代わりに$expr + $indexOfCPを活用すれば、動的にフィールド値をパターンとして扱う柔軟な検索が可能になります。
-
【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