$slice(投影)

适用对象: MongoDB vCore

$slice 运算符用于返回数组的子集。 它可用于将数组中的元素数量限制为指定数量,或从数组中的指定位置返回元素。 此运算符在处理只需要处理或显示一部分数据的大型数组时特别有用。

语法

db.collection.find({},
  {
    <field>: { $slice: <count> }
  }
)
db.collection.find({},
  {
    <field>: { $slice: [ <skip>, <limit> ] }
  }
}

parameters

说明
field 要从中切片子集的数组字段。
count 从数组开头返回的元素数。
说明
skip 要跳过的元素数目。
limit 跳过后返回的元素数。

示例

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

{
  "_id": "988d2dd1-2faa-4072-b420-b91b95cbfd60",
  "name": "Lakeshore Retail",
  "sales": {
    "salesByCategory": [
      {
        "categoryName": "Towel Racks",
        "totalSales": 13237
      },
      {
        "categoryName": "Washcloths",
        "totalSales": 44315
      },
      {
        "categoryName": "Face Towels",
        "totalSales": 42095
      },
      {
        "categoryName": "Toothbrush Holders",
        "totalSales": 47912
      },
      {
        "categoryName": "Hybrid Mattresses",
        "totalSales": 48660
      },
      {
        "categoryName": "Napkins",
        "totalSales": 31439
      },
      {
        "categoryName": "Pillow Cases",
        "totalSales": 38833
      }
    ]},
"tag": [
    '#ShopLocal',
    '#FashionStore',
    '#SeasonalSale',
    '#FreeShipping',
    '#MembershipDeals'
  ]
}

示例 1:返回数组中的第一个匹配元素

该示例查询“Lakehore Retail”的 stores 数据,并从“sales.salesByCategory”数组中找到第一个文档。

db.stores.find(
  { "name": "Lakeshore Retail"},
  { "_id":1,"name":1,"sales.salesByCategory": { $slice: 1 } } // restricts the fields to be returned
)

此查询将返回 stores 集合中的文档,数组中的第一个 categoryName 文档。

{
  "_id": "988d2dd1-2faa-4072-b420-b91b95cbfd60",
  "name": "Lakeshore Retail",
  "sales": {
    "salesByCategory": [
      {
        "categoryName": "Towel Racks",
        "totalSales": 13237
      }
    ]
  }
}

示例 2:返回数组中的最后一个元素

该示例查询“Lakehore Retail”的 stores 数据,并从“sales.salesByCategory”数组中找到最后一个文档。

db.stores.find(
  { "name": "Lakeshore Retail"},
  { "_id":1,"name":1,"sales.salesByCategory": { $slice: -1 } } 
)

此查询将返回 stores 集合中的文档,数组中的最后一个 categoryName 文档。

{
  "_id": "988d2dd1-2faa-4072-b420-b91b95cbfd60",
  "name": "Lakeshore Retail",
  "sales": {
    "salesByCategory": [
      {
        "categoryName": "Pillow Cases",
        "totalSales": 38833
      }
    ]
  }
}

示例 3:返回数组中的一系列元素

该示例查询“Lakehore Retail”的 stores 数据,并查找“sales.salesByCategory”数组中的子集范围。

db.stores.find(
  { "name": "Lakeshore Retail"},
  { "_id":1,"name":1,"sales.salesByCategory": { $slice: [3, 2] } }
)

此查询从 stores 集合返回文档,其中两个元素从 sales.salesByCategory 数组的第四个元素开始。

{
  "_id": "988d2dd1-2faa-4072-b420-b91b95cbfd60",
  "name": "Lakeshore Retail",
  "sales": {
    "salesByCategory": [
      {
        "categoryName": "Toothbrush Holders",
        "totalSales": 47912
      },
      {
        "categoryName": "Hybrid Mattresses",
        "totalSales": 48660
      }
    ]
  }
}