Dela via


$slice (matrisuppdatering)

GÄLLER FÖR: MongoDB vCore

Operatorn $slice används för att begränsa antalet element i en matris som returneras i en fråga. Det kan vara användbart när du hanterar stora matriser där endast en delmängd av elementen behövs. Den här operatorn kan tillämpas på matriser för att antingen returnera de första N-elementen, de sista N-elementen eller ett visst område med element.

Syntax

Den allmänna syntaxen för operatorn $slice är följande:

{
  "$push": {
    "<field>": {
      "$each": [ "<value1>", "<value2>" ],
      "$slice": <num>
    }
  }
}

Parametrar

beskrivning
field Matrisfältet som operatorn $slice tillämpas på.
<value1>, <value2> De värden som ska infogas i matrisen. Vi kan behålla en tom matris för att dela upp befintliga värden i matrisfältet.
<num> Ett värde på noll rensar matrisen, ett negativt värde behåller att många element från slutet av matrisen och ett positivt värde behåller så många element från början av matrisen.

Exempel

Nu ska vi granska användningen med ett json-exempeldokument från stores samlingen.

{
  "_id": "7954bd5c-9ac2-4c10-bb7a-2b79bd0963c5",
  "name": "Lakeshore Retail | DJ Equipment Stop - Port Cecile",
  "location": { "lat": 60.1441, "lon": -141.5012 },
  "staff": { "totalStaff": { "fullTime": 2, "partTime": 0 } },
  "sales": {
    "salesByCategory": [
      { "categoryName": "DJ Headphones", "totalSales": 35921 },
      { "categoryName": "DJ Cables", "totalSales": 1000 }
    ],
    "fullSales": 3700
  },
  "promotionEvents": [
    {
      "eventName": "Discount Delight Days",
      "promotionalDates": {
        "startDate": { "Year": 2024, "Month": 5, "Day": 11 },
        "endDate": { "Year": 2024, "Month": 5, "Day": 18 }
      }
    },
    {
      "eventName": "New Promotion Event",
      "promotionalDates": {
        "startDate": { "Year": 2024, "Month": 7, "Day": 1 },
        "endDate": { "Year": 2024, "Month": 7, "Day": 7 }
        },
        "discounts": [
          { "categoryName": "DJ Lights", "discountPercentage": 20 }
        ]
    },
    {
        "eventName": "Cyber Monday Event",
        "promotionalDates": {
          "startDate": { "Year": 2024, "Month": 8, "Day": 1 },
          "endDate": { "Year": 2024, "Month": 8, "Day": 7 }
        },
        "discounts": [ { "categoryName": "DJ Speakers", "discountPercentage": 25 } ]
    }
  ],
  "tag": [
    "#ShopLocal",
    "#NewArrival",
    "#FashionStore",
    "#SeasonalSale",
    "#FreeShipping",
    "#MembershipDeals"
  ]
}

Exempel 1: Segment för de första N- eller sista N-elementen från ett matrisfält

Exemplet använder $push med $each för att lägga till nya element i matrisen promotionEvents och $slice för att behålla endast det första N-elementet (positivt segment) eller de sista N-elementen (negativt segment). På så sätt ser du till att matrisen behåller de senaste posterna efter uppdateringen.

db.stores.updateOne(
  { _id: '7954bd5c-9ac2-4c10-bb7a-2b79bd0963c5' },
  {
    $push: {
      promotionEvents: {
        $each: [
          {
            eventName: "Black Friday Event",
            promotionalDates: {
              startDate: { Year: 2024, Month: 8, Day: 1 },
              endDate: { Year: 2024, Month: 8, Day: 7 }
            },
            discounts: [
              { categoryName: 'DJ Speakers', discountPercentage: 25 }
            ]
          },
          {
            eventName: "Mega Discount Days",
            promotionalDates: {
              startDate: { Year: 2024, Month: 5, Day: 11 },
              endDate: { Year: 2024, Month: 5, Day: 18 }
            },
            discounts: [
              { categoryName: "DJ Lights", discountPercentage: 20 }
            ]
          }
        ],
        $slice: -3
      }
    }
  }
)

Frågan lägger till Black Friday Event och Mega Discount Days händelsen i matrisen promotionEvents och segmenten för de tre sista elementen i matrisen.

{
  "_id": "7954bd5c-9ac2-4c10-bb7a-2b79bd0963c5",
  "name": "Lakeshore Retail | DJ Equipment Stop - Port Cecile",
  "location": { "lat": 60.1441, "lon": -141.5012 },
  "staff": { "totalStaff": { "fullTime": 2, "partTime": 0 } },
  "sales": {
    "salesByCategory": [
      { "categoryName": "DJ Headphones", "totalSales": 35921 },
      { "categoryName": "DJ Cables", "totalSales": 1000 }
    ],
    "fullSales": 3700
  },
  "promotionEvents": [
    {
      "eventName": "Cyber Monday Event",
      "promotionalDates": {
        "startDate": { "Year": 2024, "Month": 8, "Day": 1 },
        "endDate": { "Year": 2024, "Month": 8, "Day": 7 }
      },
      "discounts": [
        { "categoryName": "DJ Speakers", "discountPercentage": 25 }
      ]
    },
    {
      "eventName": "Black Friday Event",
      "promotionalDates": {
        "startDate": { "Year": 2024, "Month": 8, "Day": 1 },
        "endDate": { "Year": 2024, "Month": 8, "Day": 7 }
      },
      "discounts": [
        { "categoryName": "DJ Speakers", "discountPercentage": 25 }
      ]
    },
    {
      "eventName": "Mega Discount Days",
      "promotionalDates": {
        "startDate": { "Year": 2024, "Month": 5, "Day": 11 },
        "endDate": { "Year": 2024, "Month": 5, "Day": 18 }
      },
      "discounts": [
        { "categoryName": "DJ Lights", "discountPercentage": 20 }
      ]
    }
  ],
  "tag": [
    "#ShopLocal",
    "#NewArrival",
    "#FashionStore",
    "#SeasonalSale",
    "#FreeShipping",
    "#MembershipDeals"
  ]
}