$elemMatch (クエリ)
定義
$elemMatch
$elemMatch
演算子は、指定されたすべてのクエリ条件に一致する要素が少なくとも 1 つ含まれる配列フィールドを含むドキュメントと一致します。
互換性
次の環境でホストされる配置には $elemMatch
を使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
{ <field>: { $elemMatch: { <query1>, <query2>, ... } } }
動作
$where
式は$elemMatch
に指定できません。$text
クエリ式は$elemMatch
で指定できません。
例
要素一致
次のドキュメントが scores
コレクションにあるとします。
{ _id: 1, results: [ 82, 85, 88 ] } { _id: 2, results: [ 75, 88, 89 ] }
次のクエリは、results
配列に80
以上であり、かつ85
未満である要素が少なくとも1 つ含まれるドキュメントのみを一致させます。
db.scores.find( { results: { $elemMatch: { $gte: 80, $lt: 85 } } } )
このクエリは、要素 82
が 80
以上で、かつ 85
未満であるため、次のドキュメントが返します。
{ "_id" : 1, "results" : [ 82, 85, 88 ] }
配列要素での複数条件の指定については、配列要素での複数条件の指定を参照してください。
埋め込みドキュメントの配列
このステートメントは、survey
コレクションにドキュメントを挿入します。
db.survey.insertMany( [ { "_id": 1, "results": [ { "product": "abc", "score": 10 }, { "product": "xyz", "score": 5 } ] }, { "_id": 2, "results": [ { "product": "abc", "score": 8 }, { "product": "xyz", "score": 7 } ] }, { "_id": 3, "results": [ { "product": "abc", "score": 7 }, { "product": "xyz", "score": 8 } ] }, { "_id": 4, "results": [ { "product": "abc", "score": 7 }, { "product": "def", "score": 8 } ] }, { "_id": 5, "results": { "product": "xyz", "score": 7 } } ] )
_id
が 5
であるドキュメントは、配列を含みませんが、$elemMatch
が配列要素のみと一致することを示すために含まれています。この点については以下で例示します。
次のクエリは、results
に少なくとも 1 つの要素が含まれており、product
が "xyz"
であり、score
が 8
以上であるドキュメントに一致します。
db.survey.find( { results: { $elemMatch: { product: "xyz", score: { $gte: 8 } } } } )
具体的には、このクエリが一致するのは次のドキュメントです。
{ "_id" : 3, "results" : [ { "product" : "abc", "score" : 7 }, { "product" : "xyz", "score" : 8 } ] }
単一クエリ条件
次のセクションは、単一のクエリ条件で$elemMatch
を使用し、 $elemMatch
を省略した場合の出力の違いを示します。
例 1
$elemMatch
を使用したクエリ:
db.survey.find( { results: { $elemMatch: { product: "xyz" } } } )
クエリは、 results
内のいずれかの product
が "xyz"
であるドキュメントを返します。
[ { _id: 1, results: [ { product: 'abc', score: 10 }, { product: 'xyz', score: 5 } ] }, { _id: 2, results: [ { product: 'abc', score: 8 }, { product: 'xyz', score: 7 } ] }, { _id: 3, results: [ { product: 'abc', score: 7 }, { product: 'xyz', score: 8 } ] } ]
$elemMatch
がないクエリは以下のようになります。
db.survey.find( { "results.product": "xyz" } )
次の出力には、_id
の値が(配列に含まれていない)5
であるドキュメントも含まれていることに注意してください。
[ { _id: 1, results: [ { product: 'abc', score: 10 }, { product: 'xyz', score: 5 } ] }, { _id: 2, results: [ { product: 'abc', score: 8 }, { product: 'xyz', score: 7 } ] }, { _id: 3, results: [ { product: 'abc', score: 7 }, { product: 'xyz', score: 8 } ] }, { _id: 5, results: { product: 'xyz', score: 7 } } ]
例 2
次のクエリを考えてみましょう。
最初のクエリには、
<query>
という単一条件が$elemMatch
に指定されています。2 つ目のクエリは
$elemMatch
を省略します。
$elemMatch
を使用した最初のクエリは以下のとおりです。
db.survey.find( { "results": { $elemMatch: { product: { $ne: "xyz" } } } } )
クエリは、値が "xyz"
以外である product
を含むドキュメントを返します。
{ "_id" : 1, "results" : [ { "product" : "abc", "score" : 10 }, { "product" : "xyz", "score" : 5 } ] } { "_id" : 2, "results" : [ { "product" : "abc", "score" : 8 }, { "product" : "xyz", "score" : 7 } ] } { "_id" : 3, "results" : [ { "product" : "abc", "score" : 7 }, { "product" : "xyz", "score" : 8 } ] } { "_id" : 4, "results" : [ { "product" : "abc", "score" : 7 }, { "product" : "def", "score" : 8 } ] }
2 つ目のクエリに $elemMatch
がない場合は次のようになります。
db.survey.find( { "results.product": { $ne: "xyz" } } )
クエリでは、 product
results
のいずれも"xyz"
であるドキュメントが返されます。
{ "_id" : 4, "results" : [ { "product" : "abc", "score" : 7 }, { "product" : "def", "score" : 8 } ] }
いずれのクエリにも、_id
の値が 4
であるドキュメントが含まれており、_id
の値が 5
であるドキュメントは、product
が "xyz"
であるため省略されています。
詳細
配列のクエリに関するその他の例えは、以下を参照してください。
クエリに関するその他の例えについては、「ドキュメントのクエリ 」を参照してください。