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 N
Nuevo a partir de la versión 8.0.1.
Usa el $bottomN acumulador del $group escenario para devolver los N elementos inferiores de un grupo según un orden de clasificación especificado. Si un grupo contiene menos de N elementos, $bottomN devuelve todos los elementos del grupo.
Parámetros
-
n: un entero positivo o una expresión que se resuelve en uno y que especifica cuántos resultados inferiores 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 de la parte inferior.
Ejemplo (MongoDB Shell)
El siguiente ejemplo muestra cómo usar el $bottomN acumulador para encontrar las dos últimas ventas (la cantidad más baja) 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", bottomTwoSales: { $bottomN: { n: 2, sortBy: { quantity: -1 }, output: { quantity: "$quantity", price: "$price" } } } } } ])
Salida
[
{ "_id": "xyz", "bottomTwoSales": [{ "quantity": 9, "price": 6 }, { "quantity": 3, "price": 12 }] },
{ "_id": "abc", "bottomTwoSales": [{ "quantity": 7, "price": 8 }, { "quantity": 5, "price": 10 }] }
]
Ejemplo de uso de un operador de ventana (MongoDB Shell)
Nuevo a partir de la versión 8.0.2.
El $bottomN operador también se puede utilizar como operador de ventanas en el $setWindowFields escenario. En este contexto, devuelve una matriz de los N documentos output de la parte inferior (según los propios documentos del operadorsortBy) de entre 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, $bottomN 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
El ejemplo siguiente divide los documentosplayer, ordena cada partición y devuelve las dos rondas con la puntuación más baja desde el principio de la partición hasta el documento actual. round
db.matchScores.aggregate([ { $setWindowFields: { partitionBy: "$player", sortBy: { round: 1 }, output: { bottomTwoRoundsSoFar: { $bottomN: { n: 2, sortBy: { score: -1 }, output: { round: "$round", score: "$score" } }, window: { documents: ["unbounded", "current"] } } } } } ]);
Salida
[
{ "_id": 1, "player": "Alice", "round": 1, "score": 20, "bottomTwoRoundsSoFar": [{ "round": 1, "score": 20 }] },
{ "_id": 2, "player": "Alice", "round": 2, "score": 35, "bottomTwoRoundsSoFar": [{ "round": 2, "score": 35 }, { "round": 1, "score": 20 }] },
{ "_id": 3, "player": "Alice", "round": 3, "score": 28, "bottomTwoRoundsSoFar": [{ "round": 3, "score": 28 }, { "round": 1, "score": 20 }] },
{ "_id": 4, "player": "Bob", "round": 1, "score": 15, "bottomTwoRoundsSoFar": [{ "round": 1, "score": 15 }] },
{ "_id": 5, "player": "Bob", "round": 2, "score": 40, "bottomTwoRoundsSoFar": [{ "round": 2, "score": 40 }, { "round": 1, "score": 15 }] }
]
Cada documento se complementa con bottomTwoRoundsSoFar las dos rondas con la puntuación más baja 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 $bottomN 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):