unstable sort
$sort (aggregation) — MongoDB Manual https://docs.mongodb.com/manual/reference/operator/aggregation/sort/
Definition
$sort
-
Sorts all input documents and returns them to the pipeline in sorted order.
The
$sort
stage has the following prototype form:$sort
takes a document that specifies the field(s) to sort by and the respective sort order.<sort order>
can have one of the following values:Value Description 1
Sort ascending. -1
Sort descending. { $meta: "textScore" }
Sort by the computed textScore
metadata in descending order. See Text Score Metadata Sort for an example.If sorting on multiple fields, sort order is evaluated from left to right. For example, in the form above, documents are first sorted by
<field1>
. Then documents with the same<field1>
values are further sorted by<field2>
.
Behavior
Sort Stability
In MongoDB, sorts are inherently stable, unless sorting on a field which contains duplicate values:
- a stable sort is one that returns the same sort order each time it is performed
- an unstable sort is one that may return a different sort order when performed multiple times
If a stable sort is desired, include at least one field in your sort that contains exclusively unique values. The easiest way to guarantee this is to include the _id
field in your sort query.
Consider the following restaurant
collection:
The following command uses the $sort
stage to sort on the borough
field:
In this example, the sort is unstable, since the borough
field contains duplicate values for both Manhattan
and Brooklyn
. Documents are returned in alphabetical order by borough
, but the order of those documents with duplicate values for borough
might not the be the same across multiple executions of the same sort. For example, here are the results from two different executions of the above command:
While the values for borough
are still sorted in alphabetical order, the order of the documents containing duplicate values for borough
(i.e. Manhattan
and Brooklyn
) is not the same.
To achieve a stable sort, add a field which contains exclusively unique values to the sort. The following command uses the $sort
stage to sort on both the borough
field and the _id
field:
Since the _id
field is always guaranteed to contain exclusively unique values, the returned sort order will always be the same across multiple executions of the same sort.
Definition
$sort
-
Sorts all input documents and returns them to the pipeline in sorted order.
The
$sort
stage has the following prototype form:$sort
takes a document that specifies the field(s) to sort by and the respective sort order.<sort order>
can have one of the following values:Value Description 1
Sort ascending. -1
Sort descending. { $meta: "textScore" }
Sort by the computed textScore
metadata in descending order. See Text Score Metadata Sort for an example.If sorting on multiple fields, sort order is evaluated from left to right. For example, in the form above, documents are first sorted by
<field1>
. Then documents with the same<field1>
values are further sorted by<field2>
.
Behavior
Sort Stability
In MongoDB, sorts are inherently stable, unless sorting on a field which contains duplicate values:
- a stable sort is one that returns the same sort order each time it is performed
- an unstable sort is one that may return a different sort order when performed multiple times
If a stable sort is desired, include at least one field in your sort that contains exclusively unique values. The easiest way to guarantee this is to include the _id
field in your sort query.
Consider the following restaurant
collection:
The following command uses the $sort
stage to sort on the borough
field:
In this example, the sort is unstable, since the borough
field contains duplicate values for both Manhattan
and Brooklyn
. Documents are returned in alphabetical order by borough
, but the order of those documents with duplicate values for borough
might not the be the same across multiple executions of the same sort. For example, here are the results from two different executions of the above command:
While the values for borough
are still sorted in alphabetical order, the order of the documents containing duplicate values for borough
(i.e. Manhattan
and Brooklyn
) is not the same.
To achieve a stable sort, add a field which contains exclusively unique values to the sort. The following command uses the $sort
stage to sort on both the borough
field and the _id
field:
Since the _id
field is always guaranteed to contain exclusively unique values, the returned sort order will always be the same across multiple executions of the same sort.