I MongoDB, $filter
aggregeringspipeline-operatören returnerar en delmängd av en array baserat på ett specificerat villkor.
$filter
operatorn returnerar en array med endast de element som matchar villkoret, i sin ursprungliga ordning.
Syntax
Syntaxen ser ut så här:
{ $filter: { input: <array>, as: <string>, cond: <expression> } }
Varje fält är enligt beskrivningen nedan.
Fält | Specifikation |
---|---|
input | Ett uttryck som löser sig till en array. |
as | Detta är ett valfritt fält. Den anger ett namn för variabeln som representerar varje enskilt element i input array. Om inget namn anges (dvs. om du utelämnar det här fältet), är variabelnamnet som standard this . |
cond | Ett uttryck som löser sig till ett booleskt värde som används för att avgöra om ett element ska inkluderas i utdatamatrisen. Uttrycket refererar till varje element i input array individuellt med variabelnamnet som anges i as . |
Exempel
Anta att vi har en samling som heter players
med följande dokument
{ "_id" : 1, "player" : "Homer", "scores" : [ 1, 5, 3 ] } { "_id" : 2, "player" : "Marge", "scores" : [ 8, 17, 18 ] } { "_id" : 3, "player" : "Bart", "scores" : [ 15, 11, 8 ] }
Här är ett exempel på hur du använder $filter
operatorn för att filtrera arrayelementen i scores
fält:
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 det här exemplet filtrerade vi arrayerna till bara de element som har ett värde större än 10. Endast dessa värden returneras.
Alla värden som är mindre än 10 utelämnas från resultatet. När det gäller det första dokumentet resulterar detta i en tom array.
Här använde vi as
fältet för att namnge returvariabeln score
. Vi hänvisade sedan till den variabeln i cond
fält med $$score
. Som nämnts kan du utelämna as
och hänvisa sedan till returvariabeln med $$this
. Mer om detta senare.
Tömma arrayer
Om arrayen är tom returneras en tom array.
Anta att vi har följande dokument i vår samling:
{ "_id" : 4, "player" : "Farnsworth", "scores" : [ ] }
Här är vad som händer när vi använder $filter
till den arrayen:
db.players.aggregate([
{
$match: { _id: { $in: [ 4 ] } }
},
{
$project: {
highScores: {
$filter: {
input: "$scores",
as: "score",
cond: { $gt: [ "$$score", 10 ] }
}
}
}
}
])
Resultat:
{ "_id" : 4, "highScores" : [ ] }
Fel typ
Använder $filter
till ett fält som inte innehåller en array returnerar ett fel.
Exempel:
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
Nullvärden
Om fältet innehåller null
istället för en array är resultatet null
.
Föreställ dig att vi har följande dokument i samlingen:
{ "_id" : 5, "player" : "Meg", "scores" : null }
Här är vad som händer när vi använder $filter
till scores
fält:
db.players.aggregate([
{
$match: { _id: { $in: [ 5 ] } }
},
{
$project: {
highScores: {
$filter: {
input: "$scores",
as: "score",
cond: { $gt: [ "$$score", 10 ] }
}
}
}
}
])
Resultat:
{ "_id" : 5, "highScores" : null }
Icke-existerande fält
Använder $filter
till ett fält som inte finns resulterar i null
returneras.
Exempel:
db.players.aggregate([
{
$match: { _id: { $in: [ 5 ] } }
},
{
$project: {
highScores: {
$filter: {
input: "$name",
as: "name",
cond: { $gt: [ "$$name", 10 ] }
}
}
}
}
])
Resultat:
{ "_id" : 5, "highScores" : null }
Variabelnamnet är valfritt
I de tidigare exemplen använder jag as
för att ge variabeln ett namn.
Som nämnts, as
fältet är valfritt. Om du utelämnar det här fältet är variabelnamnet som standard this
.
Här är ett exempel:
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 ] }
Detta är samma som det första exemplet, förutom i det här exemplet utelämnar vi as
och hänvisar därför till variabeln med $$this
.