Dans MongoDB, le $slice
l'opérateur de pipeline d'agrégation renvoie un sous-ensemble d'un tableau.
Pour utiliser $slice
, vous spécifiez le nombre d'éléments à renvoyer depuis le tableau. Vous pouvez également spécifier une position de départ pour laquelle prendre le sous-ensemble du tableau.
Exemple
Supposons que nous ayons une collection appelée test
avec le document suivant :
{ "_id" : 1, "data" : [ "Aardvark", "Buffalo", "Cat", "Dog", "Horse", "Gorilla", "Zebra" ] }
Nous pouvons utiliser $slice
pour prendre un sous-ensemble du tableau dans les data
champ.
Entier positif
Fournir une seule valeur positive détermine la position de départ à partir du début du tableau.
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 3 ] }
}
}
]
)
Résultat :
{ "result" : [ "Aardvark", "Buffalo", "Cat" ] }
Dans ce cas, nous avons fourni un nombre positif de 3
, et donc les trois premiers éléments ont été renvoyés du tableau.
Entier négatif
Fournir une seule valeur négative détermine la position de départ à partir de la fin du tableau.
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -3 ] }
}
}
]
)
Résultat :
{ "result" : [ "Horse", "Gorilla", "Zebra" ] }
Dans ce cas, nous avons renvoyé les trois derniers éléments du tableau.
Notez que vous ne pouvez pas spécifier un entier négatif lorsque vous spécifiez également une position de départ. Plus d'informations à ce sujet plus tard.
Spécifiez une position de départ
Vous avez également la possibilité de spécifier une position de départ. Pour cela, fournissez un autre entier avant l'autre.
Entier positif
Voici un exemple d'utilisation d'un entier positif pour la position de départ :
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 2, 3 ] }
}
}
]
)
Résultat :
{ "result" : [ "Cat", "Dog", "Horse" ] }
Dans ce cas, nous avons spécifié une position de départ de 2
et une taille de tranche de 3
.
Notez que les tableaux sont basés sur zéro, et donc notre entier positif de 2
a entraîné l'opération de découpage à partir de la troisième position.
Entier négatif
Voici un exemple d'utilisation d'un entier négatif pour la position de départ :
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -4, 3 ] }
}
}
]
)
Résultat :
{ "result" : [ "Dog", "Horse", "Gorilla" ] }
Dans ce cas, nous avons spécifié -4
, ce qui a entraîné un décompte de quatre places à partir de la fin de l'opération de découpage.
Tranches surdimensionnées
Si vous fournissez une taille de tranche supérieure aux éléments disponibles dans le tableau, seuls les éléments restants du tableau sont renvoyés.
Exemple :
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -1, 3 ] }
}
}
]
)
Résultat :
{ "result" : [ "Zebra" ] }
Ici, nous avons spécifié que trois éléments devaient être retournés, même si nous n'avions commencé qu'une position en arrière depuis la fin du tableau. Dans ce cas, un seul élément a été renvoyé (le dernier du tableau).
Position de départ hors de portée
Fournir une position de départ hors de la plage du tableau peut renvoyer certains éléments ou un tableau vide. Tout dépend des valeurs fournies.
Voici un exemple qui renvoie un tableau vide :
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 10, 3 ] }
}
}
]
)
Résultat :
{ "result" : [ ] }
Cela a renvoyé un tableau vide car la position de départ était 10
, même s'il n'y a que 7
éléments dans le tableau (et le nombre irait de 0
à 6
).
Cependant, si nous fournissons une valeur négative supérieure à la taille du tableau, la tranche commence au début du tableau.
Exemple :
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -10, 3 ] }
}
}
]
)
Résultat :
{ "result" : [ "Aardvark", "Buffalo", "Cat" ] }
Tranche négative avec une position de départ
Comme mentionné, vous ne pouvez pas spécifier un entier négatif lorsque vous spécifiez également une position de départ. Cela entraîne une erreur.
Exemple :
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 4, -3 ] }
}
}
]
)
Résultat :
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