In MongoDB, de $slice
aggregatiepijplijnoperator retourneert een subset van een array.
$slice
gebruiken , geeft u het aantal elementen op dat moet worden geretourneerd uit de array. U kunt ook een startpositie specificeren waarvoor u de subset uit de array wilt nemen.
Voorbeeld
Stel dat we een verzameling hebben met de naam test
met het volgende document:
{ "_id" : 1, "data" : [ "Aardvark", "Buffalo", "Cat", "Dog", "Horse", "Gorilla", "Zebra" ] }
We kunnen $slice
. gebruiken om een subset te nemen uit de array in de data
veld.
Positief geheel getal
Het verstrekken van een enkele positieve waarde bepaalt de startpositie vanaf het begin van de array.
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 3 ] }
}
}
]
)
Resultaat:
{ "result" : [ "Aardvark", "Buffalo", "Cat" ] }
In dit geval hebben we een positief getal van 3
. opgegeven , en dus werden de eerste drie elementen uit de array geretourneerd.
Negatief geheel getal
Het verstrekken van een enkele negatieve waarde bepaalt de startpositie vanaf het eind van de array.
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -3 ] }
}
}
]
)
Resultaat:
{ "result" : [ "Horse", "Gorilla", "Zebra" ] }
In dit geval hebben we de laatste drie elementen van de array geretourneerd.
Houd er rekening mee dat u geen negatief geheel getal kunt opgeven als u ook een startpositie opgeeft. Hierover later meer.
Geef een startpositie op
U heeft ook de mogelijkheid om een startpositie op te geven. Om dit te doen, geeft u een ander geheel getal op vóór de andere.
Positief geheel getal
Hier is een voorbeeld van het gebruik van een positief geheel getal voor de startpositie:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 2, 3 ] }
}
}
]
)
Resultaat:
{ "result" : [ "Cat", "Dog", "Horse" ] }
In dit geval hebben we een startpositie van 2
. opgegeven en een plakgrootte van 3
.
Merk op dat arrays op nul zijn gebaseerd, en daarom is ons positieve gehele getal 2
resulteerde in de slice-operatie die op de derde positie begon.
Negatief geheel getal
Hier is een voorbeeld van het gebruik van een negatief geheel getal voor de startpositie:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -4, 3 ] }
}
}
]
)
Resultaat:
{ "result" : [ "Dog", "Horse", "Gorilla" ] }
In dit geval hebben we -4
. gespecificeerd , wat ertoe leidde dat de slice-operatie vier plaatsen terugtelde vanaf het einde.
Extra grote plakjes
Als u een segmentgrootte opgeeft die groter is dan de beschikbare elementen in de array, worden alleen de resterende array-elementen geretourneerd.
Voorbeeld:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -1, 3 ] }
}
}
]
)
Resultaat:
{ "result" : [ "Zebra" ] }
Hier hebben we gespecificeerd dat drie elementen moeten worden geretourneerd, ook al zijn we slechts één positie terug vanaf het einde van de array begonnen. In dit geval werd slechts één element geretourneerd (de laatste in de array).
Uitgangspositie buiten bereik
Als u een startpositie opgeeft die buiten het bereik van de array ligt, kunnen sommige elementen of een lege array worden geretourneerd. Het hangt allemaal af van de opgegeven waarden.
Hier is een voorbeeld dat een lege array retourneert:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 10, 3 ] }
}
}
]
)
Resultaat:
{ "result" : [ ] }
Dit leverde een lege array op omdat de startpositie 10
was , ook al zijn er maar 7
elementen in de array (en de telling zou gaan van 0
tot 6
).
Als we echter een negatieve waarde opgeven die groter is dan de arraygrootte, begint de slice vanaf het begin van de array.
Voorbeeld:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -10, 3 ] }
}
}
]
)
Resultaat:
{ "result" : [ "Aardvark", "Buffalo", "Cat" ] }
Negatieve slice met een startpositie
Zoals vermeld, kunt u geen negatief geheel getal opgeven als u ook een startpositie opgeeft. Als u dit doet, resulteert dit in een fout.
Voorbeeld:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 4, -3 ] }
}
}
]
)
Resultaat:
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