MongoDBで複数の条件に一致する配列内の2つの値を持つドキュメントを検索するクエリ
MongoDBで複数の条件に一致する配列内の2つの値を持つドキュメントを検索する方法
配列フィールドに対して複数の条件を組み合わせて検索したい場合は、$elemMatch演算子を使用します。$elemMatchは、配列内の少なくとも1つの要素が指定されたすべての条件を満たしているかどうかを判定できる便利な演算子です。
この記事では、具体的な例を通して、「配列内の2つの値がそれぞれ異なる条件に一致し、かつ配列の要素数がちょうど2つである」というドキュメントを検索する方法を解説します。
1. サンプルコレクションの作成
まず、insertOne()メソッドを使ってサンプルデータを登録したコレクションを作成しましょう。
> db.findDocumentsHaving2Demo.insertOne(
{_id : 101, Values: [78,98]}
);
{ "acknowledged" : true, "insertedId" : 101 }
> db.findDocumentsHaving2Demo.insertOne(
{_id :102, Values : [89,102]}
);
{ "acknowledged" : true, "insertedId" : 102 }
2. 登録されたドキュメントの確認
find()メソッドを使用して、コレクション内のすべてのドキュメントを表示してみます。
> db.findDocumentsHaving2Demo.find().pretty();
実行すると、次のような出力が得られます。
{ "_id" : 101, "Values" : [ 78, 98 ] }
{ "_id" : 102, "Values" : [ 89, 102 ] }
3. 複数の条件に一致するドキュメントを検索するクエリ
ここでは、「77以上78以下の値」と「90以上110以下の値」が両方とも配列内に存在し、さらに配列の要素が2つだけ(インデックス2が存在しない)という条件でドキュメントを検索します。
> db.findDocumentsHaving2Demo.find({$and: [
{Values: {$elemMatch: {$gte: 77, $lte: 78}}},
{Values: {$elemMatch: {$gte:90 , $lte: 110}}},
{'Values.2': {$exists: false}}
]});
このクエリを実行すると、次の出力が得られます。
{ "_id" : 101, "Values" : [ 78, 98 ] }
クエリのポイント解説
- $and: 複数の条件をAND結合します。すべての条件を満たすドキュメントのみが結果として返されます。
- $elemMatch: 配列内の要素が指定された条件($gte: 以上、$lte: 以下)を満たすかどうかをチェックします。同じ配列内の異なる要素が、それぞれ別の条件に一致することを保証できます。
- 'Values.2': {$exists: false}: インデックス2(3番目の要素)が存在しないこと、つまり配列の要素数がちょうど2つであることを確認します。
このように、$elemMatchと$existsを組み合わせることで、「配列内に特定の範囲の値が2つあり、それ以外の要素は含まれない」という複雑な条件でも柔軟にドキュメントを検索できます。上記のサンプルでは、_idが101のドキュメント「[78, 98]」だけが条件に一致しました。
-
MongoDBでオブジェクトの配列内の複数条件に一致するドキュメントを検索する方法($andと$regex活用)
MongoDBでオブジェクト(サブドキュメント)の配列内から、複数の条件を同時に満たすドキュメントを検索したい場合は、$and演算子と$regex演算子、さらに$elemMatchを組み合わせるのが効果的です。$andは、1つ以上の式からなる配列に対して論理AND演算を実行し、配列内のすべての条件を満たすドキュメントだけを選択します。また、$elemMatchを使うことで、配列内の同一要素が複数条件を満たすかどうかを正確に判定できます。サンプルコレクションの作成まず、検証用のコレクションを作成してドキュメントを挿入してみましょう。> db.demo525.insertOne({detai
-
MongoDBで特定の値より大きい配列要素を持つドキュメントを照会する方法($elemMatch活用)
MongoDBで配列内の値を条件に照合するにはMongoDBでは、$elemMatch 演算子を使用することで、指定したすべてのクエリ条件に一致する要素が少なくとも1つ含まれる配列フィールドを持つドキュメントを照合できます。ここでは、配列内の値が特定の値より大きいドキュメントを検索する方法を、具体的なサンプルコードとともに解説します。1. サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成します。> db.demo701.insertOne({ListOfValues:[100,200,300]}); { acknowledged : true, ins