MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

MongoDB $filtr

W MongoDB $filter Operator potoku agregacji zwraca podzbiór tablicy na podstawie określonego warunku.

$filter operator zwraca tablicę zawierającą tylko te elementy, które pasują do warunku, w ich oryginalnej kolejności.

Składnia

Składnia wygląda tak:

{ $filter: { input: <array>, as: <string>, cond: <expression> } }

Każde pole jest opisane poniżej.

Pole Specyfikacja
input Wyrażenie, które prowadzi do tablicy.
as To jest pole opcjonalne. Określa nazwę zmiennej, która reprezentuje każdy pojedynczy element input szyk. Jeśli nie określono nazwy (tj. jeśli pominiesz to pole), domyślna nazwa zmiennej to this .
cond Wyrażenie, które rozwiązuje do wartości logicznej używanej do określenia, czy element powinien zostać uwzględniony w tablicy wyjściowej. Wyrażenie odwołuje się do każdego elementu input tablica pojedynczo z nazwą zmiennej określoną w as .

Przykład

Załóżmy, że mamy kolekcję o nazwie players z następującymi dokumentami

{ "_id" : 1, "player" : "Homer", "scores" : [ 1, 5, 3 ] }
{ "_id" : 2, "player" : "Marge", "scores" : [ 8, 17, 18 ] }
{ "_id" : 3, "player" : "Bart", "scores" : [ 15, 11, 8 ] }

Oto przykład zastosowania $filter operator do filtrowania elementów tablicy w scores pole:

db.players.aggregate([
  { 
    $match: { _id: { $in: [ 1, 2, 3 ] } } 
  },
  {
    $project: {
        highScores: {
          $filter: {
              input: "$scores",
              as: "score",
              cond: { $gt: [ "$$score", 10 ] }
          }
        }
    }
  }
])

Wynik:

{ "_id" : 1, "highScores" : [ ] }
{ "_id" : 2, "highScores" : [ 17, 18 ] }
{ "_id" : 3, "highScores" : [ 15, 11 ] }

W tym przykładzie przefiltrowaliśmy tablice tylko do tych elementów, które mają wartość większą niż 10. Zwracane są tylko te wartości.

Wszelkie wartości mniejsze niż 10 są pomijane w wyniku. W przypadku pierwszego dokumentu skutkuje to pustą tablicą.

Tutaj użyliśmy as pole do nazwy zwracanej zmiennej score . Następnie odwołaliśmy się do tej zmiennej w cond pole przy użyciu $$score . Jak wspomniano, możesz pominąć as pole, a następnie odwołaj się do zmiennej zwracanej za pomocą $$this . Więcej na ten temat później.

Puste tablice

Jeśli tablica jest pusta, zwracana jest pusta tablica.

Załóżmy, że w naszej kolekcji mamy następujący dokument:

{ "_id" : 4, "player" : "Farnsworth", "scores" : [ ] }

Oto, co się dzieje, gdy zastosujemy $filter do tej tablicy:

db.players.aggregate([
  { 
    $match: { _id: { $in: [ 4 ] } } 
  },
  {
    $project: {
        highScores: {
          $filter: {
              input: "$scores",
              as: "score",
              cond: { $gt: [ "$$score", 10 ] }
          }
        }
    }
  }
])

Wynik:

{ "_id" : 4, "highScores" : [ ] }

Niewłaściwy typ

Stosuję $filter do pola, które nie zawiera tablicy, zwraca błąd.

Przykład:

db.players.aggregate([
  { 
    $match: { _id: { $in: [ 4 ] } } 
  },
  {
    $project: {
        highScores: {
          $filter: {
              input: "$player",
              as: "player",
              cond: { $gt: [ "$$player", 10 ] }
          }
        }
    }
  }
])

Wynik:

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

Wartości puste

Jeśli pole zawiera null zamiast tablicy wynikiem jest null .

Wyobraź sobie, że mamy w kolekcji następujący dokument:

{ "_id" : 5, "player" : "Meg", "scores" : null }

Oto, co się dzieje, gdy zastosujemy $filter do scores pole:

db.players.aggregate([
  { 
    $match: { _id: { $in: [ 5 ] } } 
  },
  {
    $project: {
        highScores: {
          $filter: {
              input: "$scores",
              as: "score",
              cond: { $gt: [ "$$score", 10 ] }
          }
        }
    }
  }
])

Wynik:

{ "_id" : 5, "highScores" : null }

Nieistniejące pole

Stosuję $filter do pola, które nie istnieje, daje wynik null zostanie zwrócony.

Przykład:

db.players.aggregate([
  { 
    $match: { _id: { $in: [ 5 ] } } 
  },
  {
    $project: {
        highScores: {
          $filter: {
              input: "$name",
              as: "name",
              cond: { $gt: [ "$$name", 10 ] }
          }
        }
    }
  }
])

Wynik:

{ "_id" : 5, "highScores" : null }

Nazwa zmiennej jest opcjonalna

W poprzednich przykładach używam as pole, aby przypisać nazwę do zmiennej.

Jak wspomniano, as pole jest opcjonalne. Jeśli pominiesz to pole, domyślna nazwa zmiennej to this .

Oto przykład:

db.players.aggregate([
  { 
    $match: { _id: { $in: [ 1, 2, 3 ] } } 
  },
  {
    $project: {
        highScores: {
          $filter: {
              input: "$scores",
              cond: { $gt: [ "$$this", 10 ] }
          }
        }
    }
  }
])

Wynik:

{ "_id" : 1, "highScores" : [ ] }
{ "_id" : 2, "highScores" : [ 17, 18 ] }
{ "_id" : 3, "highScores" : [ 15, 11 ] }

Jest to to samo, co w pierwszym przykładzie, z wyjątkiem tego, że w tym przykładzie pomijamy as pole, a zatem odwołaj się do zmiennej za pomocą $$this .


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongo Query pytanie $gt,$lt

  2. Seryjne iterowanie po kursorze mongodb (oczekiwanie na wywołania zwrotne przed przejściem do następnego dokumentu)

  3. Wizualne zarządzanie dokumentami i kolekcjami MongoDB

  4. Jak przeprowadzić wyszukiwanie pełnotekstowe w MongoDB?

  5. MongoDB $indexOfBytes