Definition定义
$filterSelects a subset of an array to return based on the specified condition. Returns an array with only those elements that match the condition. The returned elements are in the original order.根据指定条件选择要返回的数组子集。返回一个仅包含符合条件的元素的数组。返回的元素按原始顺序排列。
Compatibility兼容性
You can use 您可以将$filter for deployments hosted in the following environments:$filter用于在以下环境中托管的部署:
- MongoDB Atlas
: The fully managed service for MongoDB deployments in the cloud:云中MongoDB部署的完全托管服务
- MongoDB Enterprise
: The subscription-based, self-managed version of MongoDB:MongoDB的基于订阅的自我管理版本 - MongoDB Community
: The source-available, free-to-use, and self-managed version of MongoDB:MongoDB的源代码可用、免费使用和自我管理版本
Syntax语法
$filter has the following syntax:具有以下语法:
{
$filter:
{
input: <array>,
as: <string>,
cond: <expression>,
limit: <number expression>
}
}
input |
|
as | input array. input数组中每个单独元素的变量的名称。this.this。 |
cond | input array individually with the variable name specified in as.as中指定的变量名单独引用input数组的每个元素。 |
limit |
|
For more information on expressions, see Expressions.有关表达式的详细信息,请参阅表达式。
Behavior行为
| [ 1, 2, 3.1, Long(4) ] |
| [ 1, 2 ] |
| [ 1 ] |
Examples示例
A collection 集合sales has the following documents:sales有以下文档:
db.sales.insertMany( [
{
_id: 0,
items: [
{ item_id: 43, quantity: 2, price: 10, name: "pen" },
{ item_id: 2, quantity: 1, price: 240, name: "briefcase" }
]
},
{
_id: 1,
items: [
{ item_id: 23, quantity: 3, price: 110, name: "notebook" },
{ item_id: 103, quantity: 4, price: 5, name: "pen" },
{ item_id: 38, quantity: 1, price: 300, name: "printer" }
]
},
{
_id: 2,
items: [
{ item_id: 4, quantity: 1, price: 23, name: "paper" }
]
}
] )
Filter Based on Number Comparison基于数字比较的筛选器
The following example filters the 以下示例筛选items array to only include documents that have a price greater than or equal to 100:items数组,使其仅包含price大于或等于100的文档:
db.sales.aggregate( [
{
$project: {
items: {
$filter: {
input: "$items",
as: "item",
cond: { $gte: [ "$$item.price", 100 ] }
}
}
}
}
] )
[
{
_id: 0,
items: [ { item_id: 2, quantity: 1, price: 240, name: 'briefcase' } ]
},
{
_id: 1,
items: [
{ item_id: 23, quantity: 3, price: 110, name: 'notebook' },
{ item_id: 38, quantity: 1, price: 300, name: 'printer' }
]
},
{ _id: 2, items: [] }
]
Use the limit Field使用限制字段
This example uses the 此示例使用前一个示例中的sales collection from the previous example.sales集合。
The example uses the 该示例使用limit field to specify the number of matching elements returned in each items array.limit字段指定每个items数组中返回的匹配元素的数量。
db.sales.aggregate( [
{
$project: {
items: {
$filter: {
input: "$items",
as: "item",
cond: { $gte: [ "$$item.price", 100 ] },
limit: 1
}
}
}
}
] )
[
{
_id: 0,
items: [ { item_id: 2, quantity: 1, price: 240, name: 'briefcase' } ]
},
{
_id: 1,
items: [ { item_id: 23, quantity: 3, price: 110, name: 'notebook' } ]
},
{ _id: 2, items: [] }
]
limit Greater than Possible Matches限制大于可能的匹配
This example uses the 此示例使用前一个示例中的sales collection from the previous example.sales集合。
The example uses a 该示例使用的limit field value that is larger than the possible number of matching elements that can be returned. In this case, limit does not affect the query results and returns all documents matching the $gte filter criteria.limit字段值大于可以返回的匹配元素的可能数量。在这种情况下,limit不会影响查询结果,并返回符合$gte筛选条件的所有文档。
db.sales.aggregate( [
{
$project: {
items: {
$filter: {
input: "$items",
as: "item",
cond: { $gte: [ "$$item.price", 100] },
limit: 5
}
}
}
}
] )
[
{
_id: 0,
items: [ { item_id: 2, quantity: 1, price: 240, name: 'briefcase' } ]
},
{
_id: 1,
items: [
{ item_id: 23, quantity: 3, price: 110, name: 'notebook' },
{ item_id: 38, quantity: 1, price: 300, name: 'printer' }
]
},
{ _id: 2, items: [] }
]
Filter Based on String Equality Match基于字符串相等匹配的筛选器
This example uses the 此示例使用前一个示例中的sales collection from the previous example.sales集合。
The following aggregation filters for 以下聚合筛选器用于筛选items that have a name value of pen.name值为pen的items。
db.sales.aggregate( [
{
$project: {
items: {
$filter: {
input: "$items",
as: "item",
cond: { $eq: [ "$$item.name", "pen"] }
}
}
}
}
] )
[
{
_id: 0,
items: [ { item_id: 43, quantity: 2, price: 10, name: 'pen' } ]
},
{
_id: 1,
items: [ { item_id: 103, quantity: 4, price: 5, name: 'pen' } ]
},
{ _id: 2, items: [] }
]
Filter Based on Regular Expression Match基于正则表达式匹配的筛选器
This example uses the 此示例使用前一个示例中的sales collection from the previous example.sales集合。
The following aggregation uses 以下聚合使用$regexMatch to filter for items that have a name value that starts with p:$regexMatch筛选name值以p开头的items:
db.sales.aggregate( [
{
$project: {
items: {
$filter: {
input: "$items",
as: "item",
cond: {
$regexMatch: { input: "$$item.name", regex: /^p/ }
}
}
}
}
}
] )
[
{
_id: 0,
items: [ { item_id: 43, quantity: 2, price: 10, name: 'pen' } ]
},
{
_id: 1,
items: [
{ item_id: 103, quantity: 4, price: 5, name: 'pen' },
{ item_id: 38, quantity: 1, price: 300, name: 'printer' }
]
},
{
_id: 2,
items: [ { item_id: 4, quantity: 1, price: 23, name: 'paper' } ]
}
]