In MongoDB der $filter
Der Aggregations-Pipeline-Operator gibt eine Teilmenge eines Arrays basierend auf einer angegebenen Bedingung zurück.
Der $filter
Der Operator gibt ein Array mit nur den Elementen zurück, die der Bedingung entsprechen, in ihrer ursprünglichen Reihenfolge.
Syntax
Die Syntax lautet wie folgt:
{ $filter: { input: <array>, as: <string>, cond: <expression> } }
Jedes Feld ist wie unten erklärt.
Feld | Spezifikation |
---|---|
input | Ein Ausdruck, der in ein Array aufgelöst wird. |
as | Dies ist ein optionales Feld. Es gibt einen Namen für die Variable an, die jedes einzelne Element der input darstellt Reihe. Wenn kein Name angegeben ist (d. h. wenn Sie dieses Feld weglassen), lautet der Variablenname standardmäßig this . |
cond | Ein Ausdruck, der in einen booleschen Wert aufgelöst wird, der verwendet wird, um zu bestimmen, ob ein Element in das Ausgabearray aufgenommen werden soll. Der Ausdruck verweist auf jedes Element der input Array einzeln mit dem in as angegebenen Variablennamen . |
Beispiel
Angenommen, wir haben eine Sammlung namens players
mit den folgenden Dokumenten
{ "_id" : 1, "player" : "Homer", "scores" : [ 1, 5, 3 ] } { "_id" : 2, "player" : "Marge", "scores" : [ 8, 17, 18 ] } { "_id" : 3, "player" : "Bart", "scores" : [ 15, 11, 8 ] }
Hier ist ein Beispiel für die Anwendung des $filter
-Operator, um die Array-Elemente in den scores
zu filtern Feld:
db.players.aggregate([
{
$match: { _id: { $in: [ 1, 2, 3 ] } }
},
{
$project: {
highScores: {
$filter: {
input: "$scores",
as: "score",
cond: { $gt: [ "$$score", 10 ] }
}
}
}
}
])
Ergebnis:
{ "_id" : 1, "highScores" : [ ] } { "_id" : 2, "highScores" : [ 17, 18 ] } { "_id" : 3, "highScores" : [ 15, 11 ] }
In diesem Beispiel haben wir die Arrays auf genau die Elemente gefiltert, die einen Wert größer als 10 haben. Nur diese Werte werden zurückgegeben.
Alle Werte, die kleiner als 10 sind, werden im Ergebnis weggelassen. Beim ersten Dokument ergibt dies ein leeres Array.
Hier haben wir den as
verwendet Feld, um die Rückgabevariable score
zu benennen . Wir haben dann in cond
auf diese Variable verwiesen Feld mit $$score
. Wie bereits erwähnt, können Sie as
weglassen und verweisen Sie dann mit $$this
auf die Rückgabevariable . Dazu später mehr.
Leere Arrays
Wenn das Array leer ist, wird ein leeres Array zurückgegeben.
Angenommen, wir haben das folgende Dokument in unserer Sammlung:
{ "_id" : 4, "player" : "Farnsworth", "scores" : [ ] }
Folgendes passiert, wenn wir $filter
anwenden zu diesem Array:
db.players.aggregate([
{
$match: { _id: { $in: [ 4 ] } }
},
{
$project: {
highScores: {
$filter: {
input: "$scores",
as: "score",
cond: { $gt: [ "$$score", 10 ] }
}
}
}
}
])
Ergebnis:
{ "_id" : 4, "highScores" : [ ] }
Falscher Typ
Anwenden von $filter
zu einem Feld, das kein Array enthält, gibt einen Fehler zurück.
Beispiel:
db.players.aggregate([
{
$match: { _id: { $in: [ 4 ] } }
},
{
$project: {
highScores: {
$filter: {
input: "$player",
as: "player",
cond: { $gt: [ "$$player", 10 ] }
}
}
}
}
])
Ergebnis:
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
Nullwerte
Wenn das Feld null
enthält anstelle eines Arrays ist das Ergebnis null
.
Stellen Sie sich vor, wir haben das folgende Dokument in der Sammlung:
{ "_id" : 5, "player" : "Meg", "scores" : null }
Folgendes passiert, wenn wir $filter
anwenden zu den scores
Feld:
db.players.aggregate([
{
$match: { _id: { $in: [ 5 ] } }
},
{
$project: {
highScores: {
$filter: {
input: "$scores",
as: "score",
cond: { $gt: [ "$$score", 10 ] }
}
}
}
}
])
Ergebnis:
{ "_id" : 5, "highScores" : null }
Nicht vorhandenes Feld
Anwenden von $filter
zu einem Feld, das nicht existiert, ergibt null
zurückgegeben.
Beispiel:
db.players.aggregate([
{
$match: { _id: { $in: [ 5 ] } }
},
{
$project: {
highScores: {
$filter: {
input: "$name",
as: "name",
cond: { $gt: [ "$$name", 10 ] }
}
}
}
}
])
Ergebnis:
{ "_id" : 5, "highScores" : null }
Der Variablenname ist optional
In den vorherigen Beispielen verwende ich den as
Feld, um der Variablen einen Namen zuzuweisen.
Wie bereits erwähnt, der as
Feld ist optional. Wenn Sie dieses Feld weglassen, lautet der Variablenname standardmäßig this
.
Hier ist ein Beispiel:
db.players.aggregate([
{
$match: { _id: { $in: [ 1, 2, 3 ] } }
},
{
$project: {
highScores: {
$filter: {
input: "$scores",
cond: { $gt: [ "$$this", 10 ] }
}
}
}
}
])
Ergebnis:
{ "_id" : 1, "highScores" : [ ] } { "_id" : 2, "highScores" : [ 17, 18 ] } { "_id" : 3, "highScores" : [ 15, 11 ] }
Dies ist dasselbe wie im ersten Beispiel, außer dass wir in diesem Beispiel as
weglassen und verweisen daher mit $$this
auf die Variable .