I MongoDB, $slice
aggregeringspipeline-operatören returnerar en delmängd av en array.
För att använda $slice
, anger du antalet element som ska returneras från arrayen. Du kan också ange en startposition för vilken delmängden ska tas från arrayen.
Exempel
Anta att vi har en samling som heter test
med följande dokument:
{ "_id" : 1, "data" : [ "Aardvark", "Buffalo", "Cat", "Dog", "Horse", "Gorilla", "Zebra" ] }
Vi kan använda $slice
för att ta en delmängd från arrayen i data
fältet.
Positivt heltal
Att tillhandahålla ett enda positivt värde bestämmer startpositionen från början av arrayen.
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 3 ] }
}
}
]
)
Resultat:
{ "result" : [ "Aardvark", "Buffalo", "Cat" ] }
I det här fallet angav vi ett positivt nummer på 3
, och så returnerades de tre första elementen från arrayen.
Negativt heltal
Att ange ett enda negativt värde bestämmer startpositionen från slutet av arrayen.
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -3 ] }
}
}
]
)
Resultat:
{ "result" : [ "Horse", "Gorilla", "Zebra" ] }
I det här fallet returnerade vi de tre sista elementen från arrayen.
Observera att du inte kan ange ett negativt heltal när du också anger en startposition. Mer om detta senare.
Ange en startposition
Du har även möjlighet att ange en startposition. För att göra detta, ange ett annat heltal före det andra.
Positivt heltal
Här är ett exempel på hur du använder ett positivt heltal för startpositionen:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 2, 3 ] }
}
}
]
)
Resultat:
{ "result" : [ "Cat", "Dog", "Horse" ] }
I det här fallet angav vi startpositionen 2
och en skivstorlek på 3
.
Observera att matriser är nollbaserade och därför vårt positiva heltal 2
resulterade i att skivoperationen startade vid den tredje positionen.
Negativt heltal
Här är ett exempel på hur du använder ett negativt heltal för startpositionen:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -4, 3 ] }
}
}
]
)
Resultat:
{ "result" : [ "Dog", "Horse", "Gorilla" ] }
I det här fallet angav vi -4
, vilket resulterade i att skivoperationen räknade tillbaka fyra platser från slutet.
Överstora skivor
Att tillhandahålla en segmentstorlek som är större än de tillgängliga elementen i arrayen resulterar i att bara de återstående arrayelementen returneras.
Exempel:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -1, 3 ] }
}
}
]
)
Resultat:
{ "result" : [ "Zebra" ] }
Här specificerade vi att tre element skulle returneras, även om vi bara startade en position tillbaka från slutet av arrayen. I det här fallet returnerades bara ett element (det sista i arrayen).
Startposition utanför intervallet
Att tillhandahålla en startposition som ligger utanför arrayens räckvidd kan returnera vissa element eller en tom array. Allt beror på de värden som tillhandahålls.
Här är ett exempel som returnerar en tom array:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 10, 3 ] }
}
}
]
)
Resultat:
{ "result" : [ ] }
Detta returnerade en tom array eftersom startpositionen var 10
, även om det bara finns 7
element i arrayen (och antalet skulle gå från 0
till 6
).
Men om vi tillhandahåller ett negativt värde som är större än arraystorleken, börjar segmentet från början av arrayen.
Exempel:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -10, 3 ] }
}
}
]
)
Resultat:
{ "result" : [ "Aardvark", "Buffalo", "Cat" ] }
Negativ skiva med en startposition
Som nämnts kan du inte ange ett negativt heltal när du också anger en startposition. Om du gör detta resulterar det i ett fel.
Exempel:
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