sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $first Aggregation Pipeline Operator

MongoDB 4.4 introducerade $first aggregeringsrörledningsoperatör.

Denna operator returnerar det första elementet i en array.

Exempel

Anta att vi har en samling som heter spelare med följande dokument:

{ "_id" : 1, "player" : "Homer", "scores" : [ 1, 5, 3 ] }
{ "_id" : 2, "player" : "Marge", "scores" : [ 8, 17, 18 ] }
{ "_id" : 3, "player" : "Bart", "scores" : [ 15, 11, 8 ] }

Vi kan se att varje dokument har en scores fält som innehåller en array.

Vi kan använda $first för att returnera det första elementet i var och en av dessa arrayer.

Exempel:

db.players.aggregate([ 
  {
    $project: {
        "firstScore": { 
          $first: "$scores" 
        }
    }
  } 
])

Resultat:

{ "_id" : 1, "firstScore" : 1 }
{ "_id" : 2, "firstScore" : 8 }
{ "_id" : 3, "firstScore" : 15 }

Vi kan se att det första elementet i arrayen returnerades för varje dokument.

Detta motsvarar att använda $arrayElemAt operator med värdet noll (0 ):

db.players.aggregate([
  {
    $project: {
      "firstScore": { $arrayElemAt: [ "$scores", 0 ] }
    }
  }
])

Tömma arrayer

Om du tillhandahåller en tom array, $first kommer inte att returnera ett värde.

Anta att vi infogar följande dokument i vår samling:

{ "_id" : 4, "player" : "Farnsworth", "scores" : [ ] }

Låt oss köra koden igen:

db.players.aggregate([ 
  {
    $project: {
        "firstScore": { 
          $first: "$scores" 
        }
    }
  } 
])

Resultat:

{ "_id" : 1, "firstScore" : 1 }
{ "_id" : 2, "firstScore" : 8 }
{ "_id" : 3, "firstScore" : 15 }
{ "_id" : 4 }

I det här fallet returnerade dokument 4 inget värde för arrayen. Faktum är att det inte ens returnerade fältnamnet.

Nullvärden och saknade värden

Om operanden är null eller saknas, $first returnerar null .

Anta att vi infogar följande dokument:

{ "_id" : 5, "player" : "Meg", "scores" : null }

Låt oss köra koden igen:

db.players.aggregate([ 
  {
    $project: {
        "firstScore": { 
          $first: "$scores" 
        }
    }
  } 
])

Resultat:

{ "_id" : 1, "firstScore" : 1 }
{ "_id" : 2, "firstScore" : 8 }
{ "_id" : 3, "firstScore" : 15 }
{ "_id" : 4 }
{ "_id" : 5, "firstScore" : null }

Den här gången returnerade den fältet med värdet null .

Ogiltig operand

Operanden för $first måste lösas till en array, null eller saknas. Att ange en ogiltig operand resulterar i ett fel.

För att demonstrera detta, låt oss försöka använda $first mot player fält (som inte är en array):

db.players.aggregate([ 
  {
    $project: {
        "firstPlayer": { 
          $first: "$player" 
        }
    }
  } 
])

Resultat:

Error: command failed: {
	"ok" : 0,
	"errmsg" : "$first's argument must be an array, but is string",
	"code" : 28689,
	"codeName" : "Location28689"
} : aggregate failed :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/assert.js:18:14
[email protected]/mongo/shell/assert.js:618:17
[email protected]/mongo/shell/assert.js:708:16
[email protected]/mongo/shell/db.js:266:5
[email protected]/mongo/shell/collection.js:1046:12
@(shell):1:1

Som väntat returnerade den ett fel.


  1. Varför använder mongoose schema när fördelen med mongodb är att den är schemalös?

  2. Använda säkerhetskopior för att åtgärda vanliga felscenarier för MongoDB

  3. MongoDB skapade filer

  4. Python-redis keys() returnerar en lista med byteobjekt istället för strängar