In MongoDB die $slice
Der Aggregations-Pipeline-Operator gibt eine Teilmenge eines Arrays zurück.
Um $slice
zu verwenden , geben Sie die Anzahl der Elemente an, die vom Array zurückgegeben werden sollen. Sie können auch eine Startposition angeben, für die die Teilmenge aus dem Array genommen werden soll.
Beispiel
Angenommen, wir haben eine Sammlung namens test
mit folgendem Dokument:
{ "_id" : 1, "data" : [ "Aardvark", "Buffalo", "Cat", "Dog", "Horse", "Gorilla", "Zebra" ] }
Wir können $slice
verwenden um eine Teilmenge aus dem Array in den data
zu nehmen Feld.
Positive Ganzzahl
Die Angabe eines einzelnen positiven Werts bestimmt die Startposition vom Anfang des Arrays.
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 3 ] }
}
}
]
)
Ergebnis:
{ "result" : [ "Aardvark", "Buffalo", "Cat" ] }
In diesem Fall haben wir eine positive Zahl von 3
angegeben , und so wurden die ersten drei Elemente aus dem Array zurückgegeben.
Negative Ganzzahl
Die Angabe eines einzelnen negativen Werts bestimmt die Startposition vom Ende des Arrays.
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -3 ] }
}
}
]
)
Ergebnis:
{ "result" : [ "Horse", "Gorilla", "Zebra" ] }
In diesem Fall haben wir die letzten drei Elemente aus dem Array zurückgegeben.
Beachten Sie, dass Sie keine negative Ganzzahl angeben können, wenn Sie auch eine Startposition angeben. Dazu später mehr.
Geben Sie eine Startposition an
Sie haben auch die Möglichkeit, eine Startposition anzugeben. Geben Sie dazu eine andere ganze Zahl vor der anderen an.
Positive Ganzzahl
Hier ist ein Beispiel für die Verwendung einer positiven ganzen Zahl für die Startposition:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 2, 3 ] }
}
}
]
)
Ergebnis:
{ "result" : [ "Cat", "Dog", "Horse" ] }
In diesem Fall haben wir eine Startposition von 2
angegeben und eine Slice-Größe von 3
.
Beachten Sie, dass Arrays nullbasiert sind und daher unsere positive Ganzzahl 2
ist führte dazu, dass der Slice-Vorgang an der dritten Position begann.
Negative ganze Zahl
Hier ist ein Beispiel für die Verwendung einer negativen Ganzzahl für die Startposition:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -4, 3 ] }
}
}
]
)
Ergebnis:
{ "result" : [ "Dog", "Horse", "Gorilla" ] }
In diesem Fall haben wir -4
angegeben , was dazu führte, dass der Slice-Vorgang vom Ende an um vier Stellen zurückgezählt wurde.
Übergroße Scheiben
Wenn Sie eine Slice-Größe angeben, die größer ist als die verfügbaren Elemente im Array, werden nur die verbleibenden Array-Elemente zurückgegeben.
Beispiel:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -1, 3 ] }
}
}
]
)
Ergebnis:
{ "result" : [ "Zebra" ] }
Hier haben wir angegeben, dass drei Elemente zurückgegeben werden sollen, obwohl wir nur eine Position zurück vom Ende des Arrays begonnen haben. In diesem Fall wurde nur ein Element zurückgegeben (das letzte im Array).
Ausgangsposition außerhalb des zulässigen Bereichs
Die Angabe einer Startposition, die außerhalb des Bereichs des Arrays liegt, kann einige Elemente oder ein leeres Array zurückgeben. Es hängt alles von den bereitgestellten Werten ab.
Hier ist ein Beispiel, das ein leeres Array zurückgibt:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 10, 3 ] }
}
}
]
)
Ergebnis:
{ "result" : [ ] }
Dies hat ein leeres Array zurückgegeben, da die Startposition 10
war , obwohl es nur 7
gibt Elemente im Array (und die Zählung würde von 0
gehen bis 6
).
Wenn wir jedoch einen negativen Wert angeben, der größer als die Arraygröße ist, beginnt der Slice am Anfang des Arrays.
Beispiel:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -10, 3 ] }
}
}
]
)
Ergebnis:
{ "result" : [ "Aardvark", "Buffalo", "Cat" ] }
Negativer Slice mit Startposition
Wie bereits erwähnt, können Sie keine negative Ganzzahl angeben, wenn Sie auch eine Startposition angeben. Dies führt zu einem Fehler.
Beispiel:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 4, -3 ] }
}
}
]
)
Ergebnis:
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