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 :
example@sqldat.com/mongo/shell/utils.js:25:13
example@sqldat.com/mongo/shell/assert.js:18:14
example@sqldat.com/mongo/shell/assert.js:618:17
example@sqldat.com/mongo/shell/assert.js:708:16
example@sqldat.com/mongo/shell/db.js:266:5
example@sqldat.com/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 .