MongoDBで正規表現を使って特定の文字を含まないドキュメントを検索する方法
MongoDBでは、正規表現と $not 演算子を組み合わせることで、特定の文字を含むドキュメントを除外し、それ以外のドキュメントだけを表示できます。この記事では、具体的なサンプルコードとともに2つの方法を紹介します。
準備:テスト用コレクションの作成
まず、サンプルドキュメントを含むコレクションを作成しましょう。ここでは、# を含む顧客IDと含まない顧客IDが混在するデータを用意します。
> db.regexDemo.insertOne({"CustomerId":"Customer#1234","CustomerName":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cc7428f8f9e6ff3eb0ce436")
}
> db.regexDemo.insertOne({"CustomerId":"Customer5678","CustomerName":"Robert"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cc7429e8f9e6ff3eb0ce437")
}
> db.regexDemo.insertOne({"CustomerId":"Customer#777","CustomerName":"Carol"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cc742ae8f9e6ff3eb0ce438")
}
> db.regexDemo.insertOne({"CustomerId":"Customer777","CustomerName":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cc742bc8f9e6ff3eb0ce439")
}登録済みドキュメントの確認
find() メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.regexDemo.find().pretty();
実行すると、以下のような出力が得られます。
{
"_id" : ObjectId("5cc7428f8f9e6ff3eb0ce436"),
"CustomerId" : "Customer#1234",
"CustomerName" : "Chris"
}
{
"_id" : ObjectId("5cc7429e8f9e6ff3eb0ce437"),
"CustomerId" : "Customer5678",
"CustomerName" : "Robert"
}
{
"_id" : ObjectId("5cc742ae8f9e6ff3eb0ce438"),
"CustomerId" : "Customer#777",
"CustomerName" : "Carol"
}
{
"_id" : ObjectId("5cc742bc8f9e6ff3eb0ce439"),
"CustomerId" : "Customer777",
"CustomerName" : "David"
}ケース1:文字クラス [^#] を使った除外
1つ目の方法は、正規表現の否定文字クラス [^#] を使うアプローチです。パターン /^[^#]*$/ は、「先頭から末尾まで # 以外の文字のみで構成されている」ことを意味します。
> db.regexDemo.find({CustomerId: /^[^#]*$/}).pretty();このクエリを実行すると、# を含まないドキュメントのみが出力されます。
{
"_id" : ObjectId("5cc7429e8f9e6ff3eb0ce437"),
"CustomerId" : "Customer5678",
"CustomerName" : "Robert"
}
{
"_id" : ObjectId("5cc742bc8f9e6ff3eb0ce439"),
"CustomerId" : "Customer777",
"CustomerName" : "David"
}ケース2:$not 演算子を使った除外
2つ目の方法は、$not 演算子を使用するアプローチです。こちらは「# にマッチしない」という条件をより直感的に表現でき、可読性が高いのが特徴です。
> db.regexDemo.find({CustomerId: {$not: /#/}}).pretty();実行結果はケース1と同じく、# を含まないドキュメントのみが返されます。
{
"_id" : ObjectId("5cc7429e8f9e6ff3eb0ce437"),
"CustomerId" : "Customer5678",
"CustomerName" : "Robert"
}
{
"_id" : ObjectId("5cc742bc8f9e6ff3eb0ce439"),
"CustomerId" : "Customer777",
"CustomerName" : "David"
}まとめ
MongoDBで特定の文字を含むドキュメントを除外したい場合は、以下の2つの方法が使えます。
- 否定文字クラス:
/^[^#]*$/のように、除外したい文字以外のみにマッチさせる - $not 演算子:
{$not: /#/}のように、正規表現のマッチ結果を反転させる
どちらも同じ結果になりますが、$not 演算子の方が意図が明確で読みやすいため、チーム開発ではこちらが推奨されることが多いです。用途や可読性に応じて使い分けるとよいでしょう。
-
MongoDBの$in演算子に正規表現を指定する方法
MongoDBの$in演算子と正規表現の組み合わせ MongoDBでは、$in演算子の中に正規表現(regex)を直接指定することで、配列内の要素を柔軟にパターンマッチングできます。本記事では、実際のコード例を通じてその使い方を解説します。 1. コレクションの作成とドキュメントの挿入 まず、insertOne()メソッドを使って、名前のリストを含むドキュメントをコレクションに挿入します。 > db.demo675.insertOne({ ... ListOfNames:[John,Chris,David]}); { acknowledged : true, inserte
-
MongoDBでnull値を除外してドキュメントを取得する方法($ne演算子の使い方)
MongoDBでコレクション内のnull値を無視(除外)してドキュメントを取得したい場合、aggregate()の中で「$ne : null」を使用します。この記事では、実際にサンプルコレクションを作成し、null値を除外するクエリの書き方をステップごとに解説します。 1. サンプルコレクションの作成 まず、insertOne()メソッドを使って、配列フィールドに空文字・通常の文字列・nullが混在したドキュメントを持つコレクションを作成します。 > db.demo722.insertOne( ... { ... id:101, ... detail