Di MongoDB, $filter
operator pipeline agregasi mengembalikan subset array berdasarkan kondisi yang ditentukan.
$filter
operator mengembalikan array dengan hanya elemen-elemen yang cocok dengan kondisi, dalam urutan aslinya.
Sintaks
Sintaksnya seperti ini:
{ $filter: { input: <array>, as: <string>, cond: <expression> } }
Setiap bidang adalah seperti yang dijelaskan di bawah ini.
Field | Spesifikasi |
---|---|
input | Ekspresi yang diselesaikan menjadi array. |
as | Ini adalah bidang opsional. Ini menentukan nama untuk variabel yang mewakili setiap elemen individual dari input Himpunan. Jika tidak ada nama yang ditentukan (yaitu jika Anda menghilangkan kolom ini), nama variabel defaultnya adalah this . |
cond | Ekspresi yang menghasilkan nilai boolean yang digunakan untuk menentukan apakah suatu elemen harus disertakan dalam larik keluaran. Ekspresi mereferensikan setiap elemen dari input larik satu per satu dengan nama variabel yang ditentukan dalam as . |
Contoh
Misalkan kita memiliki koleksi yang disebut players
dengan dokumen berikut
{ "_id" : 1, "player" : "Homer", "scores" : [ 1, 5, 3 ] } { "_id" : 2, "player" : "Marge", "scores" : [ 8, 17, 18 ] } { "_id" : 3, "player" : "Bart", "scores" : [ 15, 11, 8 ] }
Berikut ini contoh penerapan $filter
operator untuk memfilter elemen larik dalam scores
bidang:
db.players.aggregate([
{
$match: { _id: { $in: [ 1, 2, 3 ] } }
},
{
$project: {
highScores: {
$filter: {
input: "$scores",
as: "score",
cond: { $gt: [ "$$score", 10 ] }
}
}
}
}
])
Hasil:
{ "_id" : 1, "highScores" : [ ] } { "_id" : 2, "highScores" : [ 17, 18 ] } { "_id" : 3, "highScores" : [ 15, 11 ] }
Dalam contoh ini, kami memfilter array hanya ke elemen yang memiliki nilai lebih besar dari 10. Hanya nilai tersebut yang dikembalikan.
Nilai apa pun yang kurang dari 10 dihilangkan dari hasil. Dalam kasus dokumen pertama, ini menghasilkan larik kosong.
Di sini, kami menggunakan as
bidang untuk memberi nama variabel kembali scores
. Kami kemudian merujuk ke variabel itu di cond
bidang menggunakan $$score
. Seperti yang disebutkan, Anda dapat menghilangkan as
bidang, dan kemudian merujuk ke variabel kembali menggunakan $$this
. Lebih lanjut tentang ini nanti.
Array Kosong
Jika array kosong, maka array kosong akan dikembalikan.
Misalkan kita memiliki dokumen berikut dalam koleksi kita:
{ "_id" : 4, "player" : "Farnsworth", "scores" : [ ] }
Inilah yang terjadi ketika kita menerapkan $filter
ke larik itu:
db.players.aggregate([
{
$match: { _id: { $in: [ 4 ] } }
},
{
$project: {
highScores: {
$filter: {
input: "$scores",
as: "score",
cond: { $gt: [ "$$score", 10 ] }
}
}
}
}
])
Hasil:
{ "_id" : 4, "highScores" : [ ] }
Tipe Salah
Menerapkan $filter
ke bidang yang tidak berisi larik mengembalikan kesalahan.
Contoh:
db.players.aggregate([
{
$match: { _id: { $in: [ 4 ] } }
},
{
$project: {
highScores: {
$filter: {
input: "$player",
as: "player",
cond: { $gt: [ "$$player", 10 ] }
}
}
}
}
])
Hasil:
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
Nilai Null
Jika bidang berisi null
alih-alih array, hasilnya adalah null
.
Bayangkan kita memiliki dokumen berikut dalam koleksi:
{ "_id" : 5, "player" : "Meg", "scores" : null }
Inilah yang terjadi ketika kita menerapkan $filter
ke scores
bidang:
db.players.aggregate([
{
$match: { _id: { $in: [ 5 ] } }
},
{
$project: {
highScores: {
$filter: {
input: "$scores",
as: "score",
cond: { $gt: [ "$$score", 10 ] }
}
}
}
}
])
Hasil:
{ "_id" : 5, "highScores" : null }
Bidang Tidak Ada
Menerapkan $filter
ke bidang yang tidak ada menghasilkan null
dikembalikan.
Contoh:
db.players.aggregate([
{
$match: { _id: { $in: [ 5 ] } }
},
{
$project: {
highScores: {
$filter: {
input: "$name",
as: "name",
cond: { $gt: [ "$$name", 10 ] }
}
}
}
}
])
Hasil:
{ "_id" : 5, "highScores" : null }
Nama Variabel adalah Opsional
Pada contoh sebelumnya, saya menggunakan as
bidang untuk menetapkan nama ke variabel.
Seperti disebutkan, as
lapangan adalah opsional. Jika Anda menghilangkan kolom ini, nama variabel default adalah this
.
Ini contohnya:
db.players.aggregate([
{
$match: { _id: { $in: [ 1, 2, 3 ] } }
},
{
$project: {
highScores: {
$filter: {
input: "$scores",
cond: { $gt: [ "$$this", 10 ] }
}
}
}
}
])
Hasil:
{ "_id" : 1, "highScores" : [ ] } { "_id" : 2, "highScores" : [ 17, 18 ] } { "_id" : 3, "highScores" : [ 15, 11 ] }
Ini sama dengan contoh pertama, kecuali dalam contoh ini, kita menghilangkan as
bidang, dan karena itu merujuk ke variabel menggunakan $$this
.