【MongoDB】ドキュメント配列の各要素を条件に一致させるクエリの書き方
MongoDBで配列の全要素が条件に一致するか判定する方法
MongoDBでは、every()メソッドを使うことで、配列内のすべての要素が指定した条件を満たしているかどうかを判定できます。一般的な$elemMatch演算子は「少なくとも1つの要素」が一致すればヒットしますが、every()を利用すれば、全要素が条件をクリアしているドキュメントだけを正確に抽出できます。
まずは、サンプル用のコレクションを作成しましょう。
> db.arrayConditionDemo.insertOne({"Name":"John","Marks":[40,43,45]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cbdbd06de8cc557214c0e1a")
}
> db.arrayConditionDemo.insertOne({"Name":"Mike","Marks":[45]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cbdbd17de8cc557214c0e1b")
}
> db.arrayConditionDemo.insertOne({"Name":"Chris","Marks":[43,45,59,69,78,89]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cbdbd3cde8cc557214c0e1c")
}登録済みドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみます。クエリは次のとおりです。
> db.arrayConditionDemo.find().pretty();
このクエリを実行すると、以下のような出力が得られます。
{
"_id" : ObjectId("5cbdbd06de8cc557214c0e1a"),
"Name" : "John",
"Marks" : [ 40, 43, 45 ]
}
{
"_id" : ObjectId("5cbdbd17de8cc557214c0e1b"),
"Name" : "Mike",
"Marks" : [ 45 ]
}
{
"_id" : ObjectId("5cbdbd3cde8cc557214c0e1c"),
"Name" : "Chris",
"Marks" : [ 43, 45, 59, 69, 78, 89 ]
}配列の各要素を条件と照合するクエリ
次のクエリでは、Marks配列に対してevery()を適用し、「すべての要素が40以上100以下である」という条件を満たすドキュメントのみを取得しています。
> db.arrayConditionDemo.find("return this.Marks.every(function(m) { return (m >= 40 && m<= 100) })");実行結果は以下のとおりです。3件すべてのドキュメントの点数が40〜100の範囲内に収まっているため、全件が検索結果として返されています。
{ "_id" : ObjectId("5cbdbd06de8cc557214c0e1a"), "Name" : "John", "Marks" : [ 40, 43, 45 ] }
{ "_id" : ObjectId("5cbdbd17de8cc557214c0e1b"), "Name" : "Mike", "Marks" : [ 45 ] }
{ "_id" : ObjectId("5cbdbd3cde8cc557214c0e1c"), "Name" : "Chris", "Marks" : [ 43, 45, 59, 69, 78, 89 ] }まとめ
find()にJavaScriptの関数を渡すこの書き方は、内部的には$where句と同等の動作になります。配列の全要素に対して柔軟な条件チェックが可能になる一方、JavaScriptの実行を伴うため、インデックスが活用されず大量データの検索ではパフォーマンスに影響が出る場合があります。本番環境で利用する際は、データ量やクエリの頻度を考慮して導入しましょう。
-
$elemMatch演算子を使った配列フィールドを持つドキュメントの検索方法【MongoDB】
MongoDBで配列フィールド内の要素に基づいてドキュメントを検索したい場合、$elemMatch 演算子を使用します。$elemMatch を使うことで、配列内の同一の要素に対して複数の条件を同時に適用できるのが大きな特徴です。この記事では、実際にコレクションを作成し、配列フィールドを含むドキュメントを $elemMatch で照合する手順を解説します。1. テスト用コレクションの作成まず、配列フィールド details を持つドキュメントを挿入して、サンプルコレクションを作成しましょう。> db.demo592.insertOne( ... { ... id:1
-
MongoDBで配列要素の平均値を取得するクエリの書き方
MongoDBで配列内の数値の平均を求める方法MongoDBでは、配列に格納された複数の数値から平均値を算出したいケースがよくあります。例えば、1つのドキュメントの中に複数の点数(Marks)が配列として保存されている場合、その平均点を取得したいことがあります。このような場合、集計パイプライン(aggregation)と$avg演算子を組み合わせることで、簡単に平均値を求めることができます。$avgは、指定したフィールド(配列の場合はその全要素)の数値の平均を自動的に計算してくれる便利な演算子です。以下、具体的な手順を見ていきましょう。1. コレクションを作成し、ドキュメントを挿入するまず、i