sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $slice

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

  1. Microservices Architecture för mycket frekvent dataåtkomst; i minneslösningar?

  2. MongoDB $isArray

  3. Mongoose med mongodb hur returnerar man just sparat objekt?

  4. Grupp efter summa mongodb