V MongoDB, $slice
operátor agregačního kanálu vrátí podmnožinu pole.
Chcete-li použít $slice
, určíte počet prvků, které se mají z pole vrátit. Můžete také zadat počáteční pozici, pro kterou se má podmnožina z pole převzít.
Příklad
Předpokládejme, že máme kolekci nazvanou test
s následujícím dokumentem:
{ "_id" : 1, "data" : [ "Aardvark", "Buffalo", "Cat", "Dog", "Horse", "Gorilla", "Zebra" ] }
Můžeme použít $slice
vzít podmnožinu z pole v data
pole.
Pozitivní celé číslo
Zadání jedné kladné hodnoty určuje počáteční pozici od začátku pole.
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 3 ] }
}
}
]
)
Výsledek:
{ "result" : [ "Aardvark", "Buffalo", "Cat" ] }
V tomto případě jsme uvedli kladné číslo 3
, a tak první tři prvky byly vráceny z pole.
Záporné celé číslo
Zadání jedné záporné hodnoty určuje počáteční pozici od konce pole.
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -3 ] }
}
}
]
)
Výsledek:
{ "result" : [ "Horse", "Gorilla", "Zebra" ] }
V tomto případě jsme vrátili poslední tři prvky z pole.
Všimněte si, že nemůžete zadat záporné celé číslo, když zadáte také počáteční pozici. Více o tom později.
Určete počáteční pozici
Máte také možnost určit výchozí pozici. Chcete-li to provést, zadejte jiné celé číslo před to druhé.
Pozitivní celé číslo
Zde je příklad použití kladného celého čísla pro počáteční pozici:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 2, 3 ] }
}
}
]
)
Výsledek:
{ "result" : [ "Cat", "Dog", "Horse" ] }
V tomto případě jsme zadali počáteční pozici 2
a velikost řezu 3
.
Všimněte si, že pole jsou založena na nule, a proto je naše kladné celé číslo 2
vyústilo v operaci řezu začínající na třetí pozici.
Záporné celé číslo
Zde je příklad použití záporného celého čísla pro počáteční pozici:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -4, 3 ] }
}
}
]
)
Výsledek:
{ "result" : [ "Dog", "Horse", "Gorilla" ] }
V tomto případě jsme zadali -4
, což vedlo k tomu, že operace řezu odpočítávala čtyři místa zpět od konce.
Příliš velké řezy
Poskytnutím velikosti řezu, která je větší než dostupné prvky v poli, budou vráceny pouze zbývající prvky pole.
Příklad:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -1, 3 ] }
}
}
]
)
Výsledek:
{ "result" : [ "Zebra" ] }
Zde jsme určili, že se mají vrátit tři prvky, i když jsme začali pouze o jednu pozici zpět od konce pole. V tomto případě byl vrácen pouze jeden prvek (poslední v poli).
Počáteční pozice mimo rozsah
Poskytnutí počáteční pozice, která je mimo rozsah pole, může vrátit některé prvky nebo prázdné pole. Vše závisí na poskytnutých hodnotách.
Zde je příklad, který vrací prázdné pole:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 10, 3 ] }
}
}
]
)
Výsledek:
{ "result" : [ ] }
To vrátilo prázdné pole, protože počáteční pozice byla 10
, i když existuje pouze 7
prvků v poli (a počet bude od 0
až 6
).
Pokud však zadáme zápornou hodnotu, která je větší než velikost pole, začne řez od začátku pole.
Příklad:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -10, 3 ] }
}
}
]
)
Výsledek:
{ "result" : [ "Aardvark", "Buffalo", "Cat" ] }
Záporný řez s počáteční pozicí
Jak již bylo zmíněno, nemůžete zadat záporné celé číslo, když zadáte také počáteční pozici. Pokud to uděláte, dojde k chybě.
Příklad:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 4, -3 ] }
}
}
]
)
Výsledek:
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