$all
$all
$all
运算符选择字段值为包含所有指定元素的数组的文档。
兼容性
可以使用 $all
查找托管在以下环境中的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
要指定 $all
表达式,请使用以下原型:
{ <field>: { $all: [ <value1> , <value2> ... ] } }
行为
相当于 $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 表达式。相反,当匹配单个元素时,“包含”表达式(即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
操作符查询inventory
集合中的文档,其中tags
字段的值是其元素包括appliance
、 school
和book
的大量:
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
结合使用
如果该字段包含一个文档数组,则可以将 $all
与 $elemMatch
操作符一起使用。
以下操作查询 inventory
集合中的如下文档:文档中 qty
字段的值是元素与 $elemMatch
条件相匹配的数组:
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 } )
这两个查询都将选择 inventory
集合中 num
字段的值等于 50
的所有文档。
注意
大多数情况下,MongoDB 不会将数组视作集合。此运算符为这种方法提供了一个值得注意的例外。
其他示例
有关查询数组的其他示例,请参阅:
有关查询的其他示例,请参阅查询文档。