$filter (aggregation)
Definition
New in version 3.2.
Selects a subset of an array to return based on the specifiedcondition. Returns an array with only those elements that match thecondition. The returned elements are in the original order.
$filter
has the following syntax:
- { $filter: { input: <array>, as: <string>, cond: <expression> } }
FieldSpecificationinput
An expression thatresolves to an array.as
Optional. A name for the variable that represents eachindividual element of the input
array. If no name isspecified, the variable name defaults to this
.cond
An expression that resolvesto a boolean value used to determine if an element should beincluded in the output array. The expression references eachelement of the input
array individually with the variablename specified in as
.
For more information on expressions, seeExpressions.
Behavior
Example | Results |
---|---|
| [ 1, 2, 3.1, NumberLong(4) ] |
Example
A collection sales
has the following documents:
- {
- _id: 0,
- items: [
- { item_id: 43, quantity: 2, price: 10 },
- { item_id: 2, quantity: 1, price: 240 }
- ]
- }
- {
- _id: 1,
- items: [
- { item_id: 23, quantity: 3, price: 110 },
- { item_id: 103, quantity: 4, price: 5 },
- { item_id: 38, quantity: 1, price: 300 }
- ]
- }
- {
- _id: 2,
- items: [
- { item_id: 4, quantity: 1, price: 23 }
- ]
- }
The following example filters the items
array to only includedocuments that have a price
greater than or equal to 100
:
- db.sales.aggregate([
- {
- $project: {
- items: {
- $filter: {
- input: "$items",
- as: "item",
- cond: { $gte: [ "$$item.price", 100 ] }
- }
- }
- }
- }
- ])
The operation produces the following results:
- {
- "_id" : 0,
- "items" : [
- { "item_id" : 2, "quantity" : 1, "price" : 240 }
- ]
- }
- {
- "_id" : 1,
- "items" : [
- { "item_id" : 23, "quantity" : 3, "price" : 110 },
- { "item_id" : 38, "quantity" : 1, "price" : 300 }
- ]
- }
- { "_id" : 2, "items" : [ ] }