- Reference >
- Operators >
- Aggregation Pipeline Operators >
- $firstN (aggregation accumulator)
$firstN (aggregation accumulator)¶
On this page
Definition¶
-
$firstN
¶ New in version 5.2.
Returns an aggregation of the first
n
elements within a group. The elements returned are meaningful only if in a specified sort order. If the group contains fewer thann
elements,$firstN
returns all elements in the group.
Syntax¶
input
specifies the field(s) from the document to take the firstn
of. Input can be any expression.n
has to be a positive integral expression that is either a constant or depends on the_id
value for$group
. For details see group key example.
Behavior¶
Null and Missing Values¶
$firstN
does not filter out null values.$firstN
converts missing values to null.
Consider the following aggregation that returns the first five documents from a group:
In this example:
$documents
creates the literal documents that contain player scores.$group
groups the documents bygameId
. This example has only onegameId
,G1
.PlayerD
has a missing score andPlayerE
has a nullscore
. These values are both considered as null.- The
firstFiveScores
field is specified usinginput : "$score"
and returned as an array. - Since there is no sort criteria the first 5
score
fields are returned.
Comparison of $firstN
and $topN
Accumulators¶
Both $firstN
and $topN
accumulators can accomplish similar
results.
In general:
- If the documents coming into
$group
are already ordered, you should use$firstN
. - If you’re sorting and selecting the top
n
elements then you can use$topN
to accomplish both tasks with one accumulator. $firstN
can be used as an aggregation expression,$topN
cannot.
Restrictions¶
Window Function and Aggregation Expression Support¶
$firstN
is supported as an
aggregation expression.
For details on aggregation expression usage see Using $firstN as an Aggregation Expression.
$firstN
is supported as a
window operator
.
Memory Limit Considerations¶
Aggregation pipelines which call $firstN
are subject to the
100 MB limit. If this
limit is exceeded for an individual group, the aggregation fails
with an error.
Examples¶
Consider a gamescores
collection with the following documents:
Find the First Three Player Scores for a Single Game¶
You can use the $firstN
accumulator to find the first three scores
in a single game.
The example pipeline:
- Uses
$match
to filter the results on a singlegameId
. In this case,G1
. - Uses
$group
to group the results bygameId
. In this case,G1
. - Specifies the fields that are input for
$firstN
withinput : ["$playerId"," $score"]
. - Uses
$firstN
to return the first three documents for theG1
game withn : 3
.
The operation returns the following results:
Finding the First Three Player Scores Across Multiple Games¶
You can use the $firstN
accumulator to find the first n
input fields in each game.
The example pipeline:
- Uses
$group
to group the results bygameId
. - Uses
$firstN
to return the first three documents for each game withn: 3
. - Specifies the fields that are input for
$firstN
withinput : ["$playerId", "$score"]
.
The operation returns the following results:
Using $sort
With $firstN
¶
Using a $sort
stage earlier in the pipeline can influence the
results of the $firstN
accumulator.
In this example:
{$sort : { score : -1 } }
sorts the highest scores to the back of each group.firstN
returns the three highest scores from front of each group.
The operation returns the following results:
Computing n
Based on the Group Key for $group
¶
You can also assign the value of n
dynamically. In this example,
the $cond
expression is used on the gameId
field.
The example pipeline:
- Uses
$group
to group the results bygameId
. - Specifies the fields that input for
$firstN
withinput : "$score"
. - If the
gameId
isG2
thenn
is 1, otherwisen
is 3.
The operation returns the following results:
Using $firstN
as an Aggregation Expression¶
You can also use $firstN
as an aggregation expression.
In this example:
$documents
creates the literal document that contains an array of values.$project
is used to return the output of$firstN
._id
is omited from the output with_id : 0
.$firstN
uses the input array of[10, 20, 30, 40]
.- The first three elements of the array are returned for the input document.
The operation returns the following results: