$all
$all
$all
演算子は、フィールドの値が、指定されたすべての要素を含む配列であるドキュメントを選択します。
互換性
次の環境でホストされる配置には $all
を使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
$all
式を指定するには、次のプロトタイプを使用します。
{ <field>: { $all: [ <value1> , <value2> ... ] } }
動作
$and
操作と同等
$all
は、指定された値の$and
操作と同等です。つまり、次の文です。
{ tags: { $all: [ "ssl" , "security" ] } }
上記は下記と同等です。
{ $and: [ { tags: "ssl" }, { tags: "security" } ] }
ネストされた配列
ネストされた配列の配列が渡された場合(例: [ [ "A" ] ]
)、 $all
は、 フィールドが要素としてネストされた配列を含むドキュメント(例: field: [ [ "A" ], ... ]
)、またはフィールドはネストされた配列と等しい(例: field: [ "A" ]
)。
たとえば、次のクエリを考えてみましょう[1]。
db.articles.find( { tags: { $all: [ [ "ssl", "security" ] ] } } )
このクエリは下記と同等です。
db.articles.find( { $and: [ { tags: [ "ssl", "security" ] } ] } )
また、下記とも同等です。
db.articles.find( { tags: [ "ssl", "security" ] } )
したがって、 $all
式は、 tags
フィールドがネストされた配列[ "ssl",
"security" ]
を含む配列であるか、 または ネストされた配列と等しい配列であるドキュメントに一致します。
tags: [ [ "ssl", "security" ], ... ] tags: [ "ssl", "security" ]
[1] | 単一の要素のみをマッチングする場合は $all 式は不要であるため、単一の要素を含む $all 式は説明目的で記載しています。代わりに、1 つの要素を照合する場合、"contains" という式(arrayField: element )の方が適しています。 |
例
次の例では、ドキュメントを含む inventory
コレクションを使用します。
{ _id: ObjectId("5234cc89687ea597eabee675"), code: "xyz", tags: [ "school", "book", "bag", "headphone", "appliance" ], qty: [ { size: "S", num: 10, color: "blue" }, { size: "M", num: 45, color: "blue" }, { size: "L", num: 100, color: "green" } ] } { _id: ObjectId("5234cc8a687ea597eabee676"), code: "abc", tags: [ "appliance", "school", "book" ], qty: [ { size: "6", num: 100, color: "green" }, { size: "6", num: 50, color: "blue" }, { size: "8", num: 100, color: "brown" } ] } { _id: ObjectId("5234ccb7687ea597eabee677"), code: "efg", tags: [ "school", "book" ], qty: [ { size: "S", num: 10, color: "blue" }, { size: "M", num: 100, color: "blue" }, { size: "L", num: 100, color: "green" } ] } { _id: ObjectId("52350353b2eff1353b349de9"), code: "ijk", tags: [ "electronics", "school" ], qty: [ { size: "M", num: 100, color: "green" } ] }
値を一致させるための $all
の使用
次の操作では、 $all
演算子を使用して、 tags
フィールドの値がappliance
、 school
、 book
を含む配列であるドキュメントをinventory
コレクションでクエリします。
db.inventory.find( { tags: { $all: [ "appliance", "school", "book" ] } } )
上記のクエリは、次のドキュメントを返します。
{ _id: ObjectId("5234cc89687ea597eabee675"), code: "xyz", tags: [ "school", "book", "bag", "headphone", "appliance" ], qty: [ { size: "S", num: 10, color: "blue" }, { size: "M", num: 45, color: "blue" }, { size: "L", num: 100, color: "green" } ] } { _id: ObjectId("5234cc8a687ea597eabee676"), code: "abc", tags: [ "appliance", "school", "book" ], qty: [ { size: "6", num: 100, color: "green" }, { size: "6", num: 50, color: "blue" }, { size: "8", num: 100, color: "brown" } ] }
$all
を $elemMatch
で使用する
フィールドにドキュメントの配列が含まれている場合は、$elemMatch
演算子とともに $all
を使用できます。
次の操作は、qty
フィールドの値が要素が $elemMatch
条件に一致する配列であるドキュメントを inventory
コレクションにクエリします。
db.inventory.find( { qty: { $all: [ { "$elemMatch" : { size: "M", num: { $gt: 50} } }, { "$elemMatch" : { num : 100, color: "green" } } ] } } )
このクエリでは次のドキュメントが返されます。
{ "_id" : ObjectId("5234ccb7687ea597eabee677"), "code" : "efg", "tags" : [ "school", "book"], "qty" : [ { "size" : "S", "num" : 10, "color" : "blue" }, { "size" : "M", "num" : 100, "color" : "blue" }, { "size" : "L", "num" : 100, "color" : "green" } ] } { "_id" : ObjectId("52350353b2eff1353b349de9"), "code" : "ijk", "tags" : [ "electronics", "school" ], "qty" : [ { "size" : "M", "num" : 100, "color" : "green" } ] }
$all
演算子は配列に対するクエリをサポートするために存在します。ただし、次の例のように、$all
演算子を使用して配列以外の field
を選択することもできます。
db.inventory.find( { "qty.num": { $all: [ 50 ] } } )
しかし、同じクエリを表現するには、以下の形式を使用します。
db.inventory.find( { "qty.num" : 50 } )
どちらのクエリでも、num
フィールドの値が 50
に等しい inventory
コレクション内のすべてのドキュメントが選択されます。
注意
ほとんどの場合、MongoDB では、配列はセットとして扱われません。この演算子は、このアプローチに対する注目すべき例外を提供します。
その他の例
配列のクエリに関するその他の例えは、以下を参照してください。
クエリに関するその他の例えについては、「ドキュメントのクエリ 」を参照してください。