Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
$ máx. N
Nuevo a partir de la versión 8.0.1.
El $maxN operador de Amazon DocumentDB devuelve los N valores más altos. Cuando se usa como acumulador en una $group etapa, devuelve una matriz con los N valores máximos de cada grupo. Cuando se usa como operador de expresión matricial, devuelve los N elementos máximos de una matriz.
Parámetros
-
input: una expresión que se convierte en la matriz o el campo desde el que se devuelven losnvalores máximos. -
n: expresión que se resuelve en un entero positivo que especifica cuántos valores máximos se devolverán.
Comportamiento
Comportamiento del operador de expresiones matriciales
-
No puede especificar un valor
ninferior a1. -
$maxNfiltranulllos valores encontrados en lainputmatriz. -
Si el valor especificado
nes mayor o igual al número de elementos de lainputmatriz,$maxNdevuelve todos los elementos de lainputmatriz. -
Si se
inputresuelve en un valor que no es de matriz, la operación de agregación produce errores. -
Si
inputcontiene elementos numéricos y de cadena, los elementos de cadena se ordenan antes que los numéricos según el orden de comparación de BSON.
Comportamiento del acumulador
-
Cuando se usa como acumulador,
ndebe ser una expresión integral positiva que sea una constante o que dependa del valor de._id$group -
$maxNfiltra los valores nulos y faltantes. -
Si el grupo contiene menos de
nelementos,$maxNdevuelve todos los elementos del grupo. -
$maxNcompara los datos de entrada siguiendo el orden de comparación de BSON para determinar el tipo de salida apropiado. Cuando los datos de entrada contienen varios tipos de datos, el tipo$maxNde salida es el más alto en el orden de comparación.
Orden de salida
$maxNdevuelve valores sin ningún orden de clasificación en particular. Si es obligatorio garantizar un orden de clasificación determinado, utilícelo $topN en su lugar o envuelva el resultado con$sortArray.
Ejemplo (MongoDB Shell)
El siguiente ejemplo muestra cómo usar el $maxN acumulador para recuperar las dos puntuaciones más altas de cada asignatura.
Cree documentos de muestra
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 } ]);
Ejemplo de consulta
db.scores.aggregate([ { $group: { _id: "$subject", highestTwo: { $maxN: { input: "$score", n: 2 } } } } ]);
Salida
[
{ "_id": "math", "highestTwo": [85, 93] },
{ "_id": "science", "highestTwo": [88, 90] }
]
Ejemplo de uso de expresiones (MongoDB Shell)
El $maxN operador también se puede usar como expresión dentro de una $project etapa para devolver los N elementos más grandes de un campo de matriz.
Crea documentos de muestra
db.readings.insertMany([ { _id: 1, sensor: "A", values: [45, 12, 78, 3, 56] }, { _id: 2, sensor: "B", values: [90, 23, 67, 11, 44] } ]);
Ejemplo de consulta
db.readings.aggregate([ { $project: { highestThree: { $maxN: { input: "$values", n: 3 } } }} ]);
Salida
[
{ "_id": 1, "highestThree": [45, 56, 78] },
{ "_id": 2, "highestThree": [44, 90, 67] }
]
Ejemplo de uso de un operador de ventana (MongoDB Shell)
Nuevo a partir de la versión 8.0.2.
El $maxN operador también se puede utilizar como operador de ventanas en el $setWindowFields escenario. En este contexto, devuelve una matriz con hasta los valores n más altos de los documentos de cada ventana. Especifique el operador en el output campo y, si lo desea, defina los límites de la ventana con un window documento.
nota
Cuando se usa como operador de ventana en$setWindowFields, $maxN está limitado a 100 MB de datos intermedios. Una operación que supera este límite devuelve un error.
Crea documentos de muestra
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 } ]);
Ejemplo de consulta
En el ejemplo siguiente se dividen los documentosticker, se ordenan las hour particiones y se devuelven los dos precios más altos desde el principio de la partición hasta el documento actual.
db.stockPrices.aggregate([ { $setWindowFields: { partitionBy: "$ticker", sortBy: { hour: 1 }, output: { highestTwoSoFar: { $maxN: { input: "$price", n: 2 }, window: { documents: ["unbounded", "current"] } } } } } ]);
Salida
[
{ "_id": 1, "ticker": "ABC", "hour": 1, "price": 50, "highestTwoSoFar": [50] },
{ "_id": 2, "ticker": "ABC", "hour": 2, "price": 45, "highestTwoSoFar": [50, 45] },
{ "_id": 3, "ticker": "ABC", "hour": 3, "price": 60, "highestTwoSoFar": [60, 50] },
{ "_id": 4, "ticker": "ABC", "hour": 4, "price": 40, "highestTwoSoFar": [60, 50] },
{ "_id": 5, "ticker": "XYZ", "hour": 1, "price": 30, "highestTwoSoFar": [30] },
{ "_id": 6, "ticker": "XYZ", "hour": 2, "price": 35, "highestTwoSoFar": [35, 30] },
{ "_id": 7, "ticker": "XYZ", "hour": 3, "price": 25, "highestTwoSoFar": [35, 30] }
]
Cada documento se complementa con highestTwoSoFar los dos price valores más altos de su ventana. Como se indica en la sección Ordenación de los resultados, el orden de los valores dentro de la matriz devuelta no está garantizado.
Ejemplos de código
Para ver un ejemplo de código sobre el uso $maxN del operador, elija la pestaña correspondiente al idioma que desee utilizar. Los siguientes ejemplos muestran el uso del acumulador (in$group), el uso de expresiones (in$project) y el uso del operador de ventana (in$setWindowFields):