Compartir a través de


$lastN (expresión de matriz)

SE APLICA A: núcleo virtual de MongoDB

El $lastN operador devuelve los últimos n elementos de una matriz. Resulta útil cuando desea limitar el número de elementos devueltos desde el final de una matriz, como obtener los elementos más recientes de una lista ordenada cronológicamente.

Sintaxis

La sintaxis del $objectToArray operador es la siguiente:

{
  $lastN: {
    input: <array>,
    n: <number>
  }
}

Parámetros

Descripción
input Matriz desde la que se van a devolver los últimos n elementos.
n Número de elementos que se van a devolver desde el final de la matriz. Debe ser un entero positivo.

Ejemplo

Vamos a comprender el uso con un JSON de ejemplo del conjunto de datos stores.

{
  "_id": "40d6f4d7-50cd-4929-9a07-0a7a133c2e74",
  "name": "Proseware, Inc. | Home Entertainment Hub - East Linwoodbury",
  "promotionEvents": [
    {
      "eventName": "Massive Markdown Mania",
      "promotionalDates": {
        "startDate": { "Year": 2023, "Month": 6, "Day": 29 },
        "endDate": { "Year": 2023, "Month": 7, "Day": 9 }
      }
    },
    {
      "eventName": "Fantastic Deal Days",
      "promotionalDates": {
        "startDate": { "Year": 2023, "Month": 9, "Day": 27 },
        "endDate": { "Year": 2023, "Month": 10, "Day": 7 }
      }
    },
    {
      "eventName": "Discount Delight Days",
      "promotionalDates": {
        "startDate": { "Year": 2023, "Month": 12, "Day": 26 },
        "endDate": { "Year": 2024, "Month": 1, "Day": 5 }
      }
    },
    {
      "eventName": "Super Sale Spectacular",
      "promotionalDates": {
        "startDate": { "Year": 2024, "Month": 3, "Day": 25 },
        "endDate": { "Year": 2024, "Month": 4, "Day": 2 }
      }
    },
    {
      "eventName": "Grand Deal Days",
      "promotionalDates": {
        "startDate": { "Year": 2024, "Month": 6, "Day": 23 },
        "endDate": { "Year": 2024, "Month": 6, "Day": 30 }
      }
    },
    {
      "eventName": "Major Bargain Bash",
      "promotionalDates": {
        "startDate": { "Year": 2024, "Month": 9, "Day": 21 },
        "endDate": { "Year": 2024, "Month": 9, "Day": 30 }
      }
    }
  ]
}

Ejemplo 1: Obtener los dos últimos eventos de promoción

Supongamos que quiere obtener los dos eventos de promoción más recientes de una tienda.

db.stores.aggregate([
  { $match: {"_id": "40d6f4d7-50cd-4929-9a07-0a7a133c2e74"} },
  {
    $project: {
      name: 1,
      lastTwoPromotions: {
        $lastN: {
          input: "$promotionEvents",
          n: 2
        }
      }
    }
  }
])

Esto genera la siguiente salida:

[
  {
    _id: '40d6f4d7-50cd-4929-9a07-0a7a133c2e74',
    name: 'Proseware, Inc. | Home Entertainment Hub - East Linwoodbury',
    lastTwoPromotions: [
      {
        eventName: 'Grand Deal Days',
        promotionalDates: {
          startDate: { Year: 2024, Month: 6, Day: 23 },
          endDate: { Year: 2024, Month: 6, Day: 30 }
        },
        discounts: [
          { categoryName: 'Remote Controls', discountPercentage: 7 },
          { categoryName: 'Televisions', discountPercentage: 11 },
          {
            categoryName: 'Business Projectors',
            discountPercentage: 13
          },
          { categoryName: 'Laser Projectors', discountPercentage: 6 },
          { categoryName: 'Projectors', discountPercentage: 6 },
          { categoryName: 'Projector Screens', discountPercentage: 24 }
        ]
      },
      {
        eventName: 'Major Bargain Bash',
        promotionalDates: {
          startDate: { Year: 2024, Month: 9, Day: 21 },
          endDate: { Year: 2024, Month: 9, Day: 30 }
        },
        discounts: [
          { categoryName: 'Sound Bars', discountPercentage: 9 },
          { categoryName: 'VR Games', discountPercentage: 7 },
          { categoryName: 'Xbox Games', discountPercentage: 25 },
          {
            categoryName: 'Projector Accessories',
            discountPercentage: 18
          },
          { categoryName: 'Mobile Games', discountPercentage: 8 },
          { categoryName: 'Projector Cases', discountPercentage: 22 }
        ]
      }
    ]
  }
]

Ejemplo 2: Obtener las tres últimas categorías de ventas

También puede usar $lastN para obtener las últimas categorías de ventas.

db.stores.aggregate([
  { $match: {"_id": "40d6f4d7-50cd-4929-9a07-0a7a133c2e74"} },
  {
    $project: {
      name: 1,
      lastThreeCategories: {
        $lastN: {
          input: "$sales.salesByCategory",
          n: 3
        }
      }
    }
  }
])

Esto devuelve las tres últimas categorías de ventas de la matriz salesByCategory.

[
  {
    _id: '40d6f4d7-50cd-4929-9a07-0a7a133c2e74',
    name: 'Proseware, Inc. | Home Entertainment Hub - East Linwoodbury',
    lastThreeCategories: [
      { categoryName: 'Game Controllers', totalSales: 43522 },
      { categoryName: 'Remote Controls', totalSales: 28946 },
      { categoryName: 'VR Games', totalSales: 32272 }
    ]
  }
]