sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB $filter

I MongoDB er $filter aggregeringspipeline-operatør returnerer en delmængde af et array baseret på en specificeret betingelse.

$filter operator returnerer et array med kun de elementer, der matcher betingelsen, i deres oprindelige rækkefølge.

Syntaks

Syntaksen ser sådan ud:

{ $filter: { input: <array>, as: <string>, cond: <expression> } }

Hvert felt er som forklaret nedenfor.

Felt Specifikation
input Et udtryk der omdannes til en matrix.
as Dette er et valgfrit felt. Den angiver et navn for den variabel der repræsenterer hvert enkelt element i input array. Hvis der ikke er angivet noget navn (dvs. hvis du udelader dette felt), er variabelnavnet som standard this .
cond Et udtryk der løses til en boolesk værdi, der bruges til at bestemme, om et element skal inkluderes i output-arrayet. Udtrykket refererer til hvert element i input array individuelt med variabelnavnet angivet i as .

Eksempel

Antag, at vi har en samling kaldet players med følgende dokumenter

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

Her er et eksempel på anvendelse af $filter operator til at filtrere array-elementerne i scores felt:

db.players.aggregate([
  { 
    $match: { _id: { $in: [ 1, 2, 3 ] } } 
  },
  {
    $project: {
        highScores: {
          $filter: {
              input: "$scores",
              as: "score",
              cond: { $gt: [ "$$score", 10 ] }
          }
        }
    }
  }
])

Resultat:

{ "_id" : 1, "highScores" : [ ] }
{ "_id" : 2, "highScores" : [ 17, 18 ] }
{ "_id" : 3, "highScores" : [ 15, 11 ] }

I dette eksempel filtrerede vi arrays til kun de elementer, der har en værdi større end 10. Kun disse værdier returneres.

Alle værdier, der er mindre end 10, udelades fra resultatet. I tilfælde af det første dokument resulterer dette i et tomt array.

Her brugte vi as felt for at navngive returvariablen scores . Vi henviste derefter til den variabel i cond felt ved hjælp af $$score . Som nævnt kan du udelade as felt, og referer derefter til returvariablen ved hjælp af $$this . Mere om dette senere.

Tomme arrays

Hvis arrayet er tomt, returneres et tomt array.

Antag, at vi har følgende dokument i vores samling:

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

Her er, hvad der sker, når vi anvender $filter til det array:

db.players.aggregate([
  { 
    $match: { _id: { $in: [ 4 ] } } 
  },
  {
    $project: {
        highScores: {
          $filter: {
              input: "$scores",
              as: "score",
              cond: { $gt: [ "$$score", 10 ] }
          }
        }
    }
  }
])

Resultat:

{ "_id" : 4, "highScores" : [ ] }

Forkert type

Anvender $filter til et felt, der ikke indeholder et array, returnerer en fejl.

Eksempel:

db.players.aggregate([
  { 
    $match: { _id: { $in: [ 4 ] } } 
  },
  {
    $project: {
        highScores: {
          $filter: {
              input: "$player",
              as: "player",
              cond: { $gt: [ "$$player", 10 ] }
          }
        }
    }
  }
])

Resultat:

Error: command failed: {
	"ok" : 0,
	"errmsg" : "input to $filter must be an array not string",
	"code" : 28651,
	"codeName" : "Location28651"
} : 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

Nul-værdier

Hvis feltet indeholder null i stedet for et array er resultatet null .

Forestil dig, at vi har følgende dokument i samlingen:

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

Her er, hvad der sker, når vi anvender $filter til scores felt:

db.players.aggregate([
  { 
    $match: { _id: { $in: [ 5 ] } } 
  },
  {
    $project: {
        highScores: {
          $filter: {
              input: "$scores",
              as: "score",
              cond: { $gt: [ "$$score", 10 ] }
          }
        }
    }
  }
])

Resultat:

{ "_id" : 5, "highScores" : null }

Ikke-eksisterende felt

Anvender $filter til et felt, der ikke eksisterer, resulterer i null bliver returneret.

Eksempel:

db.players.aggregate([
  { 
    $match: { _id: { $in: [ 5 ] } } 
  },
  {
    $project: {
        highScores: {
          $filter: {
              input: "$name",
              as: "name",
              cond: { $gt: [ "$$name", 10 ] }
          }
        }
    }
  }
])

Resultat:

{ "_id" : 5, "highScores" : null }

Variabelnavnet er valgfrit

I de foregående eksempler bruger jeg as felt for at tildele et navn til variablen.

Som nævnt er as felt er valgfrit. Hvis du udelader dette felt, er variabelnavnet som standard this .

Her er et eksempel:

db.players.aggregate([
  { 
    $match: { _id: { $in: [ 1, 2, 3 ] } } 
  },
  {
    $project: {
        highScores: {
          $filter: {
              input: "$scores",
              cond: { $gt: [ "$$this", 10 ] }
          }
        }
    }
  }
])

Resultat:

{ "_id" : 1, "highScores" : [ ] }
{ "_id" : 2, "highScores" : [ 17, 18 ] }
{ "_id" : 3, "highScores" : [ 15, 11 ] }

Dette er det samme som det første eksempel, undtagen i dette eksempel udelader vi as felt, og referer derfor til variablen ved hjælp af $$this .


  1. MongoDB :Aggregationsramme :Hent sidst daterede dokument pr. grupperings-id

  2. MongoDB jokertegn i nøglen til en forespørgsel

  3. mongodb:finde den højeste numeriske værdi af en kolonne

  4. Er MongoDB på en eller anden måde begrænset til en enkelt kerne?