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.
$ a PN
Nuevo a partir de la versión 8.0.1.
Usa el $topN acumulador del $group escenario para devolver los N elementos principales de un grupo según un orden de clasificación especificado. Si un grupo contiene menos de N elementos, $topN devuelve todos los elementos del grupo.
Parámetros
-
n: un entero positivo o una expresión que se resuelve en uno y que especifica el número de resultados principales que se devolverán por grupo. -
sortBy: un documento que especifica el orden de clasificación.1Utilícelo para ascender o-1descender. -
output: expresión que especifica los campos que se devolverán de cada uno de los N documentos principales.
Ejemplo (MongoDB Shell)
El siguiente ejemplo muestra cómo usar el $topN acumulador para encontrar las dos ventas más vendidas (la cantidad más alta) por artículo de una colección de ventas.
Crea documentos de muestra
db.sales.insertMany([ { item: "abc", quantity: 10, price: 5 }, { item: "abc", quantity: 7, price: 8 }, { item: "abc", quantity: 5, price: 10 }, { item: "xyz", quantity: 15, price: 3 }, { item: "xyz", quantity: 9, price: 6 }, { item: "xyz", quantity: 3, price: 12 } ])
Ejemplo de consulta
db.sales.aggregate([ { $group: { _id: "$item", topTwoSales: { $topN: { n: 2, sortBy: { quantity: -1 }, output: { quantity: "$quantity", price: "$price" } } } } } ])
Salida
[
{ "_id": "xyz", "topTwoSales": [{ "quantity": 15, "price": 3 }, { "quantity": 9, "price": 6 }] },
{ "_id": "abc", "topTwoSales": [{ "quantity": 10, "price": 5 }, { "quantity": 7, "price": 8 }] }
]
Ejemplo de uso de un operador de ventana (MongoDB Shell)
Nuevo a partir de la versión 8.0.2.
El $topN operador también se puede utilizar como operador de ventanas en el $setWindowFields escenario. En este contexto, devuelve una matriz output de los N documentos de cada ventana de los primeros N documentos (según los propios del operadorsortBy). 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, $topN está limitado a 100 MB de datos intermedios. Una operación que supera este límite devuelve un error.
Crea documentos de muestra
db.matchScores.insertMany([ { _id: 1, player: "Alice", round: 1, score: 20 }, { _id: 2, player: "Alice", round: 2, score: 35 }, { _id: 3, player: "Alice", round: 3, score: 28 }, { _id: 4, player: "Bob", round: 1, score: 15 }, { _id: 5, player: "Bob", round: 2, score: 40 } ]);
Ejemplo de consulta
En el ejemplo siguiente se dividen los documentosplayer, se ordena cada partición y se devuelven las dos rondas con mayor puntuación desde el principio de la partición hasta el documento actual. round
db.matchScores.aggregate([ { $setWindowFields: { partitionBy: "$player", sortBy: { round: 1 }, output: { topTwoRoundsSoFar: { $topN: { n: 2, sortBy: { score: -1 }, output: { round: "$round", score: "$score" } }, window: { documents: ["unbounded", "current"] } } } } } ]);
Salida
[
{ "_id": 1, "player": "Alice", "round": 1, "score": 20, "topTwoRoundsSoFar": [{ "round": 1, "score": 20 }] },
{ "_id": 2, "player": "Alice", "round": 2, "score": 35, "topTwoRoundsSoFar": [{ "round": 2, "score": 35 }, { "round": 1, "score": 20 }] },
{ "_id": 3, "player": "Alice", "round": 3, "score": 28, "topTwoRoundsSoFar": [{ "round": 2, "score": 35 }, { "round": 3, "score": 28 }] },
{ "_id": 4, "player": "Bob", "round": 1, "score": 15, "topTwoRoundsSoFar": [{ "round": 1, "score": 15 }] },
{ "_id": 5, "player": "Bob", "round": 2, "score": 40, "topTwoRoundsSoFar": [{ "round": 2, "score": 40 }, { "round": 1, "score": 15 }] }
]
Cada documento se complementa con topTwoRoundsSoFar las dos rondas con la puntuación más alta de su partición hasta el documento actual, incluido. Si la ventana contiene menos de dos documentos, se devuelven todos.
Ejemplos de código
Para ver un ejemplo de código sobre el uso $topN del operador, seleccione la pestaña correspondiente al idioma que desee utilizar. Los siguientes ejemplos muestran tanto el uso del acumulador (en$group) como el uso del operador de ventanas (en$setWindowFields):