I MongoDB er $slice
aggregeringspipeline-operatør returnerer en delmængde af et array.
For at bruge $slice
, angiver du antallet af elementer, der skal returneres fra arrayet. Du kan også angive en startposition, som du vil tage delsættet for fra arrayet.
Eksempel
Antag, at vi har en samling kaldet test
med følgende dokument:
{ "_id" : 1, "data" : [ "Aardvark", "Buffalo", "Cat", "Dog", "Horse", "Gorilla", "Zebra" ] }
Vi kan bruge $slice
at tage et undersæt fra arrayet i data
felt.
Positivt heltal
Angivelse af en enkelt positiv værdi bestemmer startpositionen fra starten af arrayet.
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 3 ] }
}
}
]
)
Resultat:
{ "result" : [ "Aardvark", "Buffalo", "Cat" ] }
I dette tilfælde har vi angivet et positivt tal på 3
, og så de første tre elementer blev returneret fra arrayet.
Negativt heltal
Angivelse af en enkelt negativ værdi bestemmer startpositionen fra slutningen af arrayet.
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -3 ] }
}
}
]
)
Resultat:
{ "result" : [ "Horse", "Gorilla", "Zebra" ] }
I dette tilfælde returnerede vi de sidste tre elementer fra arrayet.
Bemærk, at du ikke kan angive et negativt heltal, når du også angiver en startposition. Mere om dette senere.
Angiv en startposition
Du har også mulighed for at angive en startposition. For at gøre dette skal du angive et andet heltal før det andet.
Positivt heltal
Her er et eksempel på brug af et positivt heltal til startpositionen:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 2, 3 ] }
}
}
]
)
Resultat:
{ "result" : [ "Cat", "Dog", "Horse" ] }
I dette tilfælde specificerede vi en startposition på 2
og en skivestørrelse på 3
.
Bemærk, at arrays er nul-baserede, og derfor vores positive heltal 2
resulterede i, at skiveoperationen startede ved den tredje position.
Negativt heltal
Her er et eksempel på brug af et negativt heltal til startpositionen:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -4, 3 ] }
}
}
]
)
Resultat:
{ "result" : [ "Dog", "Horse", "Gorilla" ] }
I dette tilfælde specificerede vi -4
, hvilket resulterede i, at skiveoperationen tæller fire pladser tilbage fra slutningen.
Overstore skiver
Angivelse af en udsnitsstørrelse, der er større end de tilgængelige elementer i arrayet, resulterer i, at kun de resterende array-elementer returneres.
Eksempel:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -1, 3 ] }
}
}
]
)
Resultat:
{ "result" : [ "Zebra" ] }
Her specificerede vi, at tre elementer skulle returneres, selvom vi kun startede en position tilbage fra enden af arrayet. I dette tilfælde blev der kun returneret ét element (det sidste i arrayet).
Udenfor rækkevidde startposition
Angivelse af en startposition, der er uden for rækkevidden af arrayet, kan returnere nogle elementer eller et tomt array. Det hele afhænger af de værdier, der leveres.
Her er et eksempel, der returnerer et tomt array:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 10, 3 ] }
}
}
]
)
Resultat:
{ "result" : [ ] }
Dette returnerede et tomt array, fordi startpositionen var 10
, selvom der kun er 7
elementer i arrayet (og antallet ville gå fra 0
til 6
).
Men hvis vi angiver en negativ værdi, der er større end matrixstørrelsen, starter udsnittet fra starten af matrixen.
Eksempel:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -10, 3 ] }
}
}
]
)
Resultat:
{ "result" : [ "Aardvark", "Buffalo", "Cat" ] }
Negativ udsnit med en startposition
Som nævnt kan du ikke angive et negativt heltal, når du også angiver en startposition. Dette resulterer i en fejl.
Eksempel:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 4, -3 ] }
}
}
]
)
Resultat:
Error: command failed: { "ok" : 0, "errmsg" : "Third argument to $slice must be positive: -3", "code" : 28729, "codeName" : "Location28729" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:639:17 [email protected]/mongo/shell/assert.js:729:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1058:12 @(shell):1:1