MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

MongoDB $filter

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 .


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Performa agregasi pencarian yang buruk

  2. Set Replika MongoDB yang Terdistribusi Secara Geografis untuk Waktu Aktif 100%

  3. Mengembalikan elemen array dalam dari beberapa dokumen dalam bentuk yang diurutkan

  4. MongoDB melalui Mongoose JS - Apa itu findByID?

  5. Kueri dengan format tanggal string di mongodb