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
.