MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB $filter

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 .