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
.