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

Filtro MongoDB $

In MongoDB, il $filter l'operatore della pipeline di aggregazione restituisce un sottoinsieme di una matrice in base a una condizione specificata.

Il $filter l'operatore restituisce un array con solo gli elementi che soddisfano la condizione, nel loro ordine originale.

Sintassi

La sintassi è questa:

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

Ogni campo è come spiegato di seguito.

Campo Specifica
input Un'espressione che si risolve in un array.
as Questo è un campo facoltativo. Specifica un nome per la variabile che rappresenta ogni singolo elemento dell' input Vettore. Se non viene specificato alcun nome (ad es. se ometti questo campo), il nome della variabile per impostazione predefinita è this .
cond Un'espressione che si risolve in un valore booleano utilizzato per determinare se un elemento deve essere incluso nell'array di output. L'espressione fa riferimento a ciascun elemento dell' input array singolarmente con il nome della variabile specificato in as .

Esempio

Supponiamo di avere una collezione chiamata players con i seguenti documenti

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

Ecco un esempio di applicazione del $filter per filtrare gli elementi dell'array nei scores campo:

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

Risultato:

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

In questo esempio, abbiamo filtrato gli array solo per quegli elementi che hanno un valore maggiore di 10. Vengono restituiti solo quei valori.

Tutti i valori inferiori a 10 vengono omessi dal risultato. Nel caso del primo documento, questo risulta in un array vuoto.

Qui, abbiamo usato il as campo per denominare la variabile di ritorno score . Abbiamo quindi fatto riferimento a quella variabile in cond campo utilizzando $$score . Come accennato, puoi omettere as campo, quindi fare riferimento alla variabile di ritorno utilizzando $$this . Ne parleremo più avanti.

Matrici vuote

Se l'array è vuoto, viene restituito un array vuoto.

Supponiamo di avere il seguente documento nella nostra collezione:

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

Ecco cosa succede quando applichiamo $filter a quell'array:

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

Risultato:

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

Tipo errato

Applicazione di $filter in un campo che non contiene un array restituisce un errore.

Esempio:

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

Risultato:

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

Valori Nulli

Se il campo contiene null invece di un array, il risultato è null .

Immagina di avere il seguente documento nella raccolta:

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

Ecco cosa succede quando applichiamo $filter ai scores campo:

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

Risultato:

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

Campo inesistente

Applicazione di $filter in un campo che non esiste risulta null in fase di restituzione.

Esempio:

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

Risultato:

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

Il nome della variabile è facoltativo

Negli esempi precedenti, utilizzo as campo per assegnare un nome alla variabile.

Come accennato, il as il campo è facoltativo. Se ometti questo campo, il nome della variabile verrà impostato automaticamente su this .

Ecco un esempio:

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

Risultato:

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

Questo è lo stesso del primo esempio, tranne che in questo esempio omettiamo il as campo, e quindi fare riferimento alla variabile usando $$this .