$firstN (数组表达式)

适用对象: MongoDB vCore

运算符 $firstN 返回数组中的第一个 n 个元素。 如果要限制从数组开头返回的元素数,例如从列表中获取前几项,则它很有用。

语法

$firstN 运算符的语法如下:

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

参数

DESCRIPTION
input 从中返回前 n 个元素的数组。
n 要从数组开头返回的元素数。 必须是正整数。

示例:

让我们了解 stores 数据集中的示例 json 的用法。

{
  "_id": "40d6f4d7-50cd-4929-9a07-0a7a133c2e74",
  "name": "Proseware, Inc. | Home Entertainment Hub - East Linwoodbury",
  "location": {
    "lat": 70.1272,
    "lon": 69.7296
  },
  "staff": {
    "totalStaff": {
      "fullTime": 19,
      "partTime": 20
    }
  },
  "sales": {
    "totalSales": 151864,
    "salesByCategory": [
      {
        "categoryName": "Sound Bars",
        "totalSales": 2120
      },
      {
        "categoryName": "Home Theater Projectors",
        "totalSales": 45004
      },
      {
        "categoryName": "Game Controllers",
        "totalSales": 43522
      },
      {
        "categoryName": "Remote Controls",
        "totalSales": 28946
      },
      {
        "categoryName": "VR Games",
        "totalSales": 32272
      }
    ]
  }
}

示例 1:获取前三个销售类别

假设你想要获取前三个销售类别进行分析。

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

这会生成以下输出:

[
  {
    _id: '40d6f4d7-50cd-4929-9a07-0a7a133c2e74',
    name: 'Proseware, Inc. | Home Entertainment Hub - East Linwoodbury',
    totalSales: 151864,
    firstThreeCategories: [
      { categoryName: 'Sound Bars', totalSales: 2120 },
      { categoryName: 'Home Theater Projectors', totalSales: 45004 },
      { categoryName: 'Game Controllers', totalSales: 43522 }
    ]
  }
]

示例 2:获取前两个促销事件

还可以用于 $firstN 从商店获取前几个促销事件。

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

这会返回前两个促销活动,其中包含其完整详细信息,包括事件名称、促销日期和折扣信息。

[
  {
    _id: '40d6f4d7-50cd-4929-9a07-0a7a133c2e74',
    name: 'Proseware, Inc. | Home Entertainment Hub - East Linwoodbury',
    firstTwoPromotions: [
      {
        eventName: 'Massive Markdown Mania',
        promotionalDates: {
          startDate: { Year: 2023, Month: 6, Day: 29 },
          endDate: { Year: 2023, Month: 7, Day: 9 }
        },
        discounts: [
          { categoryName: 'DVD Players', discountPercentage: 14 },
          { categoryName: 'Projector Lamps', discountPercentage: 6 },
          { categoryName: 'Media Players', discountPercentage: 21 },
          { categoryName: 'Blu-ray Players', discountPercentage: 21 },
          {
            categoryName: 'Home Theater Systems',
            discountPercentage: 5
          },
          { categoryName: 'Televisions', discountPercentage: 22 }
        ]
      },
      {
        eventName: 'Fantastic Deal Days',
        promotionalDates: {
          startDate: { Year: 2023, Month: 9, Day: 27 },
          endDate: { Year: 2023, Month: 10, Day: 7 }
        },
        discounts: [
          { categoryName: 'TV Mounts', discountPercentage: 15 },
          { categoryName: 'Game Accessories', discountPercentage: 25 },
          {
            categoryName: 'Portable Projectors',
            discountPercentage: 25
          },
          { categoryName: 'Projector Screens', discountPercentage: 21 },
          { categoryName: 'Blu-ray Players', discountPercentage: 20 },
          { categoryName: 'DVD Players', discountPercentage: 21 }
        ]
      }
    ]
  }
]