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
.