sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $filter

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 .


  1. SCUMM:Den agentbaserade databasövervakningsinfrastrukturen i ClusterControl

  2. Java-klient för att ansluta ElasticCache Redis Cache Node

  3. Lista över MongoDB-datumoperatörer, metoder och variabler

  4. Redis administrationspanel