View a markdown version of this page

$Último N - Amazon DocumentDB

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.

$Último N

Nuevo a partir de la versión 8.0.1.

El $lastN operador de Amazon DocumentDB devuelve los últimos N elementos. Cuando se usa como acumulador en una $group etapa, devuelve una matriz con los últimos N valores de cada grupo. Cuando se usa como operador de expresión matricial, devuelve los últimos N elementos de una matriz.

Parámetros

  • input: la expresión que se convierte en el campo o la matriz desde los que se devuelven los valores.

  • n: un entero positivo que especifica cuántos valores se devolverán. Cuando se usa como acumulador en una $group etapa, también n puede ser una expresión, siempre que se resuelva como un entero positivo según el campo del grupo_id.

Ejemplo (MongoDB Shell)

El siguiente ejemplo muestra cómo usar el $lastN acumulador para recuperar las dos últimas cantidades de cada artículo durante la agregación.

nota

$lastNselecciona los valores en el orden en que los documentos llegan al $group escenario. Para devolver los últimos N valores de un orden específico (por ejemplo, por fecha o puntuación), añada una $sort etapa antes$group.

Crea documentos de muestra

db.sales.insertMany([ { item: "abc", quantity: 10, date: ISODate("2023-01-01") }, { item: "abc", quantity: 5, date: ISODate("2023-01-02") }, { item: "abc", quantity: 8, date: ISODate("2023-01-03") }, { item: "xyz", quantity: 15, date: ISODate("2023-01-01") }, { item: "xyz", quantity: 7, date: ISODate("2023-01-02") }, { item: "xyz", quantity: 3, date: ISODate("2023-01-03") } ]);

Ejemplo de consulta

db.sales.aggregate([ { $group: { _id: "$item", lastTwoQuantities: { $lastN: { input: "$quantity", n: 2 } } } } ]);

Salida

[ { "_id": "abc", "lastTwoQuantities": [5, 8] }, { "_id": "xyz", "lastTwoQuantities": [7, 3] } ]

Ejemplo de uso de expresiones (MongoDB Shell)

El $lastN operador también se puede usar como expresión dentro de una $project etapa para devolver los últimos N elementos de un campo matricial.

Crea documentos de muestra

db.inventory.insertMany([ { _id: 1, item: "abc", tags: ["red", "green", "blue", "yellow", "purple"] }, { _id: 2, item: "xyz", tags: ["alpha", "beta", "gamma"] } ]);

Ejemplo de consulta

db.inventory.aggregate([ { $project: { lastThreeTags: { $lastN: { input: "$tags", n: 3 } } }} ]);

Salida

[ { "_id": 1, "lastThreeTags": ["blue", "yellow", "purple"] }, { "_id": 2, "lastThreeTags": ["alpha", "beta", "gamma"] } ]

Ejemplo de uso de un operador de ventana (MongoDB Shell)

Nuevo a partir de la versión 8.0.2.

El $lastN operador también se puede utilizar como operador de ventanas en el $setWindowFields escenario. En este contexto, devuelve una matriz con hasta los últimos n valores 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, $lastN 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 recientes vistos desde el principio de la partición hasta el documento actual.

db.stockPrices.aggregate([ { $setWindowFields: { partitionBy: "$ticker", sortBy: { hour: 1 }, output: { lastTwoSoFar: { $lastN: { input: "$price", n: 2 }, window: { documents: ["unbounded", "current"] } } } } } ]);

Salida

[ { "_id": 1, "ticker": "ABC", "hour": 1, "price": 50, "lastTwoSoFar": [50] }, { "_id": 2, "ticker": "ABC", "hour": 2, "price": 45, "lastTwoSoFar": [50, 45] }, { "_id": 3, "ticker": "ABC", "hour": 3, "price": 60, "lastTwoSoFar": [45, 60] }, { "_id": 4, "ticker": "ABC", "hour": 4, "price": 40, "lastTwoSoFar": [60, 40] }, { "_id": 5, "ticker": "XYZ", "hour": 1, "price": 30, "lastTwoSoFar": [30] }, { "_id": 6, "ticker": "XYZ", "hour": 2, "price": 35, "lastTwoSoFar": [30, 35] }, { "_id": 7, "ticker": "XYZ", "hour": 3, "price": 25, "lastTwoSoFar": [35, 25] } ]

Cada documento se complementa con lastTwoSoFar los dos últimos price valores de su ventana (en hour orden).

Ejemplos de código

Para ver un ejemplo de código sobre el uso $lastN del operador, seleccione 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):

Node.js
const { MongoClient } = require('mongodb'); async function example() { const client = new MongoClient('mongodb://<username>:<password>@<cluster-endpoint>:27017/?tls=true&tlsCAFile=global-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false'); try { await client.connect(); const db = client.db('test'); // Accumulator usage: last N values per group const sales = db.collection('sales'); await sales.insertMany([ { item: "abc", quantity: 10, date: new Date("2023-01-01") }, { item: "abc", quantity: 5, date: new Date("2023-01-02") }, { item: "abc", quantity: 8, date: new Date("2023-01-03") }, { item: "xyz", quantity: 15, date: new Date("2023-01-01") }, { item: "xyz", quantity: 7, date: new Date("2023-01-02") }, { item: "xyz", quantity: 3, date: new Date("2023-01-03") } ]); const accumulatorResult = await sales.aggregate([ { $group: { _id: "$item", lastTwoQuantities: { $lastN: { input: "$quantity", n: 2 } } } } ]).toArray(); console.log('Accumulator result:', accumulatorResult); // Expression usage: last N elements of an array field const inventory = db.collection('inventory'); await inventory.insertMany([ { _id: 1, item: "abc", tags: ["red", "green", "blue", "yellow", "purple"] }, { _id: 2, item: "xyz", tags: ["alpha", "beta", "gamma"] } ]); const expressionResult = await inventory.aggregate([ { $project: { lastThreeTags: { $lastN: { input: "$tags", n: 3 } } } } ]).toArray(); console.log('Expression result:', expressionResult); // Window operator usage: last N values over a window in each partition const stockPrices = db.collection('stockPrices'); await 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 } ]); const windowResult = await stockPrices.aggregate([ { $setWindowFields: { partitionBy: "$ticker", sortBy: { hour: 1 }, output: { lastTwoSoFar: { $lastN: { input: "$price", n: 2 }, window: { documents: ["unbounded", "current"] } } } } } ]).toArray(); console.log('Window result:', windowResult); } finally { await client.close(); } } example();
Python
from pymongo import MongoClient from datetime import datetime def example(): client = MongoClient('mongodb://<username>:<password>@<cluster-endpoint>:27017/?tls=true&tlsCAFile=global-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false') try: db = client['test'] # Accumulator usage: last N values per group sales = db['sales'] sales.insert_many([ { 'item': 'abc', 'quantity': 10, 'date': datetime(2023, 1, 1) }, { 'item': 'abc', 'quantity': 5, 'date': datetime(2023, 1, 2) }, { 'item': 'abc', 'quantity': 8, 'date': datetime(2023, 1, 3) }, { 'item': 'xyz', 'quantity': 15, 'date': datetime(2023, 1, 1) }, { 'item': 'xyz', 'quantity': 7, 'date': datetime(2023, 1, 2) }, { 'item': 'xyz', 'quantity': 3, 'date': datetime(2023, 1, 3) } ]) accumulator_result = list(sales.aggregate([ { '$group': { '_id': '$item', 'lastTwoQuantities': { '$lastN': { 'input': '$quantity', 'n': 2 } } } } ])) print('Accumulator result:', accumulator_result) # Expression usage: last N elements of an array field inventory = db['inventory'] inventory.insert_many([ { '_id': 1, 'item': 'abc', 'tags': ['red', 'green', 'blue', 'yellow', 'purple'] }, { '_id': 2, 'item': 'xyz', 'tags': ['alpha', 'beta', 'gamma'] } ]) expression_result = list(inventory.aggregate([ { '$project': { 'lastThreeTags': { '$lastN': { 'input': '$tags', 'n': 3 } } } } ])) print('Expression result:', expression_result) # Window operator usage: last N values over a window in each partition stock_prices = db['stockPrices'] stock_prices.insert_many([ { '_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 } ]) window_result = list(stock_prices.aggregate([ { '$setWindowFields': { 'partitionBy': '$ticker', 'sortBy': { 'hour': 1 }, 'output': { 'lastTwoSoFar': { '$lastN': { 'input': '$price', 'n': 2 }, 'window': { 'documents': ['unbounded', 'current'] } } } } } ])) print('Window result:', window_result) finally: client.close() example()