$minN
New from version 8.0.1.
The $minN operator in Amazon DocumentDB returns the N smallest values. When used as an accumulator in a $group stage, it returns an array of the N minimum values in each group. When used as an array expression operator, it returns the N minimum elements of an array.
Parameters
-
input: An expression that resolves to the array or field from which to return the minimumnvalues. -
n: An expression that resolves to a positive integer specifying how many minimum values to return.
Behavior
Array expression operator behavior
-
You cannot specify a value of
nless than1. -
$minNfilters outnullvalues found in theinputarray. -
If the specified
nis greater than or equal to the number of elements in theinputarray,$minNreturns all elements in theinputarray. -
If
inputresolves to a non-array value, the aggregation operation errors. -
If
inputcontains both numeric and string elements, the numeric elements are sorted before string elements according to the BSON comparison order.
Accumulator behavior
-
When used as an accumulator,
nmust be a positive integral expression that is either a constant or depends on the_idvalue for$group. -
$minNfilters out null and missing values. -
If the group contains fewer than
nelements,$minNreturns all elements in the group. -
$minNcompares input data following the BSON comparison order to determine the appropriate output type. When the input data contains multiple data types, the$minNoutput type is the lowest in the comparison order.
Output ordering
$minN returns values in no particular sort order. If guaranteeing a particular sort order is a requirement, use $bottomN instead, or wrap the result with $sortArray.
Example (MongoDB Shell)
The following example shows how to use the $minN accumulator to retrieve the two lowest scores for each subject.
Create sample documents
db.scores.insertMany([ { subject: "math", score: 85 }, { subject: "math", score: 72 }, { subject: "math", score: 93 }, { subject: "math", score: 68 }, { subject: "science", score: 90 }, { subject: "science", score: 78 }, { subject: "science", score: 65 }, { subject: "science", score: 88 } ]);
Query example
db.scores.aggregate([ { $group: { _id: "$subject", lowestTwo: { $minN: { input: "$score", n: 2 } } } } ]);
Output
[
{ "_id": "math", "lowestTwo": [72, 68] },
{ "_id": "science", "lowestTwo": [78, 65] }
]
Expression usage example (MongoDB Shell)
The $minN operator can also be used as an expression within a $project stage to return the N smallest elements from an array field.
Create sample documents
db.readings.insertMany([ { _id: 1, sensor: "A", values: [45, 12, 78, 3, 56] }, { _id: 2, sensor: "B", values: [90, 23, 67, 11, 44] } ]);
Query example
db.readings.aggregate([ { $project: { lowestThree: { $minN: { input: "$values", n: 3 } } }} ]);
Output
[
{ "_id": 1, "lowestThree": [45, 12, 3] },
{ "_id": 2, "lowestThree": [44, 23, 11] }
]
Window operator usage example (MongoDB Shell)
New from version 8.0.2.
The $minN operator can also be used as a window operator in the $setWindowFields stage. In this context, it returns an array of up to the n smallest values for the documents in each window. You specify the operator under the output field, and optionally define the window boundaries with a window document.
Note
When used as a window operator in $setWindowFields, $minN is limited to 100 MB of intermediate data. An operation that exceeds this limit returns an error.
Create sample documents
db.stockPrices.insertMany([ { _id: 1, ticker: "ABC", hour: 1, price: 50 }, { _id: 2, ticker: "ABC", hour: 2, price: 45 }, { _id: 3, ticker: "ABC", hour: 3, price: 60 }, { _id: 4, ticker: "ABC", hour: 4, price: 40 }, { _id: 5, ticker: "XYZ", hour: 1, price: 30 }, { _id: 6, ticker: "XYZ", hour: 2, price: 35 }, { _id: 7, ticker: "XYZ", hour: 3, price: 25 } ]);
Query example
The following example partitions the documents by ticker, sorts each partition by hour, and returns the two lowest prices seen from the start of the partition through the current document.
db.stockPrices.aggregate([ { $setWindowFields: { partitionBy: "$ticker", sortBy: { hour: 1 }, output: { lowestTwoSoFar: { $minN: { input: "$price", n: 2 }, window: { documents: ["unbounded", "current"] } } } } } ]);
Output
[
{ "_id": 1, "ticker": "ABC", "hour": 1, "price": 50, "lowestTwoSoFar": [50] },
{ "_id": 2, "ticker": "ABC", "hour": 2, "price": 45, "lowestTwoSoFar": [45, 50] },
{ "_id": 3, "ticker": "ABC", "hour": 3, "price": 60, "lowestTwoSoFar": [45, 50] },
{ "_id": 4, "ticker": "ABC", "hour": 4, "price": 40, "lowestTwoSoFar": [40, 45] },
{ "_id": 5, "ticker": "XYZ", "hour": 1, "price": 30, "lowestTwoSoFar": [30] },
{ "_id": 6, "ticker": "XYZ", "hour": 2, "price": 35, "lowestTwoSoFar": [30, 35] },
{ "_id": 7, "ticker": "XYZ", "hour": 3, "price": 25, "lowestTwoSoFar": [25, 30] }
]
Each document is augmented with lowestTwoSoFar, the two smallest price values within its window. As noted in the Output ordering section, the order of values within the returned array is not guaranteed.
Code examples
To view a code example for using the $minN operator, choose the tab for the language that you want to use. The following examples show accumulator usage (in $group), expression usage (in $project), and window operator usage (in $setWindowFields):