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 :
example@sqldat.com/mongo/shell/utils.js:25:13
example@sqldat.com/mongo/shell/assert.js:18:14
example@sqldat.com/mongo/shell/assert.js:618:17
example@sqldat.com/mongo/shell/assert.js:708:16
example@sqldat.com/mongo/shell/db.js:266:5
example@sqldat.com/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 .