MongoDBでオブジェクトの配列内の複数条件に一致するドキュメントを検索する方法($andと$regex活用)
MongoDBでオブジェクト(サブドキュメント)の配列内から、複数の条件を同時に満たすドキュメントを検索したい場合は、$and演算子と$regex演算子、さらに$elemMatchを組み合わせるのが効果的です。
$andは、1つ以上の式からなる配列に対して論理AND演算を実行し、配列内のすべての条件を満たすドキュメントだけを選択します。また、$elemMatchを使うことで、配列内の同一要素が複数条件を満たすかどうかを正確に判定できます。
サンプルコレクションの作成
まず、検証用のコレクションを作成してドキュメントを挿入してみましょう。
> db.demo525.insertOne({"details":[{Name:"Chris","CountryName":"US"}]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e8ae5ef437efc8605595b66")
}
> db.demo525.insertOne({"details":[{Name:"Bob","CountryName":"UK"}]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e8ae5f8437efc8605595b67")
}
> db.demo525.insertOne({"details":[{Name:"chris","CountryName":"us"}]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e8ae602437efc8605595b68")
}
> db.demo525.insertOne({"details":[{Name:"Mike","CountryName":"UK"}]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e8ae60b437efc8605595b69")
}登録済みドキュメントの確認
find()メソッドを使用して、コレクション内のすべてのドキュメントを表示します。
> db.demo525.find();
実行すると、以下のような出力が得られます。
{ "_id" : ObjectId("5e8ae5ef437efc8605595b66"), "details" : [ { "Name" : "Chris", "CountryName" : "US" } ] }
{ "_id" : ObjectId("5e8ae5f8437efc8605595b67"), "details" : [ { "Name" : "Bob", "CountryName": "UK" } ] }
{ "_id" : ObjectId("5e8ae602437efc8605595b68"), "details" : [ { "Name" : "chris", "CountryName" : "us" } ] }
{ "_id" : ObjectId("5e8ae60b437efc8605595b69"), "details" : [ { "Name" : "Mike", "CountryName" : "UK" } ] }オブジェクトの配列内で複数条件に一致するドキュメントを検索するクエリ
次のクエリでは、「Name」が「Chris」で始まり(大文字・小文字を区別しない)、かつ「CountryName」が「us」で始まるドキュメントを検索しています。
> db.demo525.find(
... {"$and": [
... { "details" : { "$elemMatch" :{ "Name": {$regex: new RegExp('^' + 'Chris', 'i')}}} },
... { "details" : { "$elemMatch" :{ "CountryName": {$regex: new RegExp('^' + 'us', 'i')}}}
}
... ]}
... )クエリの実行結果
このクエリを実行すると、以下のように2件のドキュメントが取得できます。
{ "_id" : ObjectId("5e8ae5ef437efc8605595b66"), "details" : [ { "Name" : "Chris", "CountryName" : "US" } ] }
{ "_id" : ObjectId("5e8ae602437efc8605595b68"), "details" : [ { "Name" : "chris", "CountryName" : "us" } ] }ポイント解説
- $and:複数の条件式を論理ANDで結合し、すべてを満たすドキュメントのみを返します。
- $elemMatch:配列内の同じ要素が指定した複数条件を同時に満たすことを保証します。これにより、別々の要素にまたがる誤マッチを防げます。
- $regex:正規表現によるパターンマッチングを行います。「^」を付けることで前方一致になり、インデックスを利用した高速な検索も可能です。
- RegExpの第2引数'i'を指定することで、大文字・小文字を区別せずに検索できます。そのため「Chris/US」と「chris/us」の両方が一致対象となっています。
このように$and、$elemMatch、$regexを組み合わせれば、オブジェクトの配列を持つドキュメントに対しても柔軟かつ正確な複合条件検索を実現できます。
-
MongoDBでオブジェクト配列を_idやフィールド値で検索する方法($unwindと$matchの活用)
MongoDBでオブジェクトの配列から特定の条件でドキュメントを検索するにはMongoDBにおいて、オブジェクトの配列(ネストされた配列)内の要素を_idやその他のフィールドの値で検索したい場合、通常のfind()メソッドではなく、アグリゲーション(集計パイプライン)を使用するのが効果的です。特に$unwindと$matchを組み合わせることで、配列内の個々の要素を抽出して絞り込むことができます。この記事では、実際にコレクションを作成し、オブジェクト配列の中から特定の条件に一致する要素を取得する手順を解説します。1. サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成します。
-
MongoDBでサブドキュメントの配列をクエリする方法
MongoDBでサブドキュメントの配列をクエリするには、集計パイプラインの$unwindを使用します。$unwindは、配列フィールドを展開し、配列の各要素ごとに個別のドキュメントを生成するステージです。これにより、配列内のサブドキュメントを個別にフィルタリングできるようになります。ここでは、大学の情報を含むコレクションを作成し、その中から特定の条件に一致するサブドキュメントを抽出する手順を解説します。コレクションの作成まず、insertOne()メソッドを使って、サブドキュメントの配列を含むドキュメントを挿入しましょう。> db.demo499.insertOne({... "