Delen via


$slice

De $slice operator wordt gebruikt om een subset van een matrix te retourneren. Het kan worden gebruikt om het aantal elementen in een matrix te beperken tot een opgegeven getal of om elementen te retourneren van een opgegeven positie in de matrix. De operator is handig bij het verwerken van grote matrices waarbij slechts een deel van de gegevens nodig is voor verwerking of weergave.

Syntaxis

De syntaxis voor de $slice operator is als volgt.

  • Retourneert elementen van het begin of einde van de matrix
{
  $slice: [ <array>, <n> ]
}
  • Retourneert elementen van de opgegeven positie in de matrix
{
  $slice: [ <array>, <position>, <n> ]
}

Parameterwaarden

Kenmerk Description
array Elke geldige matrixexpressie.
position Elke geldige expressie voor gehele getallen.
n Elke geldige expressie voor gehele getallen.

Voorbeelden

Bekijk dit voorbeelddocument uit de winkelverzameling.

{
    "_id": "0fcc0bf0-ed18-4ab8-b558-9848e18058f4",
    "name": "First Up Consultants | Beverage Shop - Satterfieldmouth",
    "location": {
        "lat": -89.2384,
        "lon": -46.4012
    },
    "staff": {
        "totalStaff": {
            "fullTime": 8,
            "partTime": 20
        }
    },
    "sales": {
        "totalSales": 75670,
        "salesByCategory": [
            {
                "categoryName": "Wine Accessories",
                "totalSales": 34440
            },
            {
                "categoryName": "Bitters",
                "totalSales": 39496
            },
            {
                "categoryName": "Rum",
                "totalSales": 1734
            }
        ]
    },
    "promotionEvents": [
        {
            "eventName": "Unbeatable Bargain Bash",
            "promotionalDates": {
                "startDate": {
                    "Year": 2024,
                    "Month": 6,
                    "Day": 23
                },
                "endDate": {
                    "Year": 2024,
                    "Month": 7,
                    "Day": 2
                }
            },
            "discounts": [
                {
                    "categoryName": "Whiskey",
                    "discountPercentage": 7
                },
                {
                    "categoryName": "Bitters",
                    "discountPercentage": 15
                },
                {
                    "categoryName": "Brandy",
                    "discountPercentage": 8
                },
                {
                    "categoryName": "Sports Drinks",
                    "discountPercentage": 22
                },
                {
                    "categoryName": "Vodka",
                    "discountPercentage": 19
                }
            ]
        },
        {
            "eventName": "Steal of a Deal Days",
            "promotionalDates": {
                "startDate": {
                    "Year": 2024,
                    "Month": 9,
                    "Day": 21
                },
                "endDate": {
                    "Year": 2024,
                    "Month": 9,
                    "Day": 29
                }
            },
            "discounts": [
                {
                    "categoryName": "Organic Wine",
                    "discountPercentage": 19
                },
                {
                    "categoryName": "White Wine",
                    "discountPercentage": 20
                },
                {
                    "categoryName": "Sparkling Wine",
                    "discountPercentage": 19
                },
                {
                    "categoryName": "Whiskey",
                    "discountPercentage": 17
                },
                {
                    "categoryName": "Vodka",
                    "discountPercentage": 23
                }
            ]
        }
    ]
}

Voorbeeld 1: De set elementen uit de matrix retourneren

Met deze query worden de eerste drie elementen van de matrix opgehaald voor sales.salesByCategory binnen _id: 988d2dd1-2faa-4072-b420-b91b95cbfd60 de stores verzameling.

db.stores.aggregate([{
    $match: {
        _id: "988d2dd1-2faa-4072-b420-b91b95cbfd60"
    }
}, {
    $project: {
        salesByCategory: {
            $slice: ["$sales.salesByCategory", 3]
        }
    }
}])

Deze query retourneert het volgende resultaat.

[
    {
        "_id": "988d2dd1-2faa-4072-b420-b91b95cbfd60",
        "salesByCategory": [
            {
                "categoryName": "Towel Racks",
                "totalSales": 13237
            },
            {
                "categoryName": "Washcloths",
                "totalSales": 44315
            },
            {
                "categoryName": "Face Towels",
                "totalSales": 42095
            }
        ]
    }
]

Voorbeeld 2: Segmenteren met $push

Deze query gebruikt $push om $each nieuwe elementen toe te voegen aan de promotionEvents matrix en $slice om alleen de eerste N-elementen (positief segment) of laatste N (negatieve segment) te behouden. Dit zorgt ervoor dat de matrix de meest recente vermeldingen na de update bewaart.

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
        }
    }
})

De query retourneert het volgende resultaat.

[
    {
        "_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"
        ]
    }
]

Voorbeeld 3: Het eerste overeenkomende element ophalen uit een matrix

Met deze query wordt het eerste document opgehaald uit de matrix sales.salesByCategory.

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

Deze query retourneert het volgende resultaat.

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

Voorbeeld 4: Het laatste element ophalen uit een matrix

Met deze query wordt het laatste document opgehaald uit de matrix sales.salesByCategory.

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

Deze query retourneert het volgende resultaat.

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

Voorbeeld 5: Een bereik van elementen ophalen uit een matrix

Met deze query wordt een subsetbereik opgehaald uit de matrix sales.salesByCategory.

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

Deze query retourneert het volgende resultaat.

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