Docs 菜单
Docs 主页
/
MongoDB Manual
/ / / /

$all

在此页面上

  • 兼容性
  • 语法
  • 行为
  • 举例
  • 其他示例
$all

$all 运算符选择字段值为包含所有指定元素的数组的文档。

可以使用 $all 查找托管在以下环境中的部署:

  • MongoDB Atlas :用于在云中部署 MongoDB 的完全托管服务

  • MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本

  • MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本

要指定 $all 表达式,请使用以下原型:

{ <field>: { $all: [ <value1> , <value2> ... ] } }

$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 表达式。相反,当匹配单个元素时,“包含”表达式(即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操作符查询inventory集合中的文档,其中tags字段的值是其元素包括applianceschoolbook的数组:

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 操作符一起使用。

以下操作查询 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 不会将数组视作集合。此运算符为这种方法提供了一个值得注意的例外。

有关查询数组的其他示例,请参阅:

有关查询的其他示例,请参阅查询文档。

提示

另请参阅:

后退

数组查询

来年

$elemMatch