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

MongoDB $eq Aggregation Pipeline Operator

Di MongoDB, $eq operator pipeline agregasi membandingkan dua nilai dan mengembalikan true atau false , tergantung pada apakah kedua nilai tersebut setara atau tidak.

Contoh

Misalkan kita memiliki koleksi yang disebut data dengan dokumen sebagai berikut:

{ "_id" : 1, "a" : 250, "b" : 250 }
{ "_id" : 2, "a" : 250, "b" : 100 }

Kita dapat menggunakan $eq operator untuk membandingkan a dan b bidang:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2 ] } } },
     {
       $project:
          {
            a: 1,
            b: 1,
            isEquivalent: { $eq: [ "$a", "$b" ] }
          }
     }
   ]
)

Hasil:

{ "_id" : 1, "a" : 250, "b" : 250, "isEquivalent" : true }
{ "_id" : 2, "a" : 250, "b" : 100, "isEquivalent" : false }

Pada dokumen pertama, a dan b bidang setara, yang menghasilkan nilai kembalian true . Tetapi di dokumen kedua mereka tidak setara, yang menghasilkan nilai kembalian false .

Membandingkan Jenis

$eq operator membandingkan nilai dan tipe menggunakan urutan perbandingan BSON yang ditentukan untuk nilai dari tipe yang berbeda.

Misalkan koleksi kami berisi dokumen-dokumen berikut:

{ "_id" : 3, "a" : 250, "b" : "250" }
{ "_id" : 4, "a" : 250, "b" : NumberDecimal("250") }
{ "_id" : 5, "a" : NumberDecimal("250"), "b" : NumberDecimal("250.00") }
{ "_id" : 6, "a" : "2021-01-03T23:30:15.100Z", "b" : ISODate("2021-01-03T23:30:15.100Z") }

Kami dapat menerapkan $eq ke a dan b bidang dokumen tersebut:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 3, 4, 5, 6 ] } } },
     {
       $project:
          {
            a: 1,
            b: 1,
            isEquivalent: { $eq: [ "$a", "$b" ] }
          }
     }
   ]
).pretty()

Hasil:

{ "_id" : 3, "a" : 250, "b" : "250", "isEquivalent" : false }
{ "_id" : 4, "a" : 250, "b" : NumberDecimal("250"), "isEquivalent" : true }
{
	"_id" : 5,
	"a" : NumberDecimal("250"),
	"b" : NumberDecimal("250.00"),
	"isEquivalent" : true
}
{
	"_id" : 6,
	"a" : "2021-01-03T23:30:15.100Z",
	"b" : ISODate("2021-01-03T23:30:15.100Z"),
	"isEquivalent" : false
}

Dalam dokumen 3, keduanya a dan b memiliki nilai 250 , tetapi jika Anda melihat lebih dekat pada b , ini adalah string (dikelilingi oleh tanda kutip ganda). Oleh karena itu, dokumen pertama mengembalikan false .

Dokumen 4 mengembalikan true karena kedua kolom berisi 250 dan keduanya adalah angka. Ini benar meskipun a adalah ganda dan b adalah desimal.

Dokumen 5 mengembalikan true karena keduanya desimal dan keduanya bernilai sama (walaupun yang satu secara eksplisit menggunakan tempat desimal dan yang lainnya tidak).

Dokumen 6 mengembalikan false karena, meskipun nilai tanggal/waktu sama persis, mereka menggunakan tipe yang berbeda untuk menyatakan tanggal tersebut (a menggunakan string tanggal/waktu dan b menggunakan objek Tanggal).

Nilai Null

Membandingkan nilai dengan null mengembalikan false , kecuali keduanya null .

Misalkan kita menambahkan dokumen berikut ke koleksi kita:

{ "_id" : 7, "a" : 250, "b" : null }
{ "_id" : 8, "a" : null, "b" : null }

Ayo terapkan $eq ke dokumen-dokumen itu:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 7, 8 ] } } },
     {
       $project:
          {
            a: 1,
            b: 1,
            isEquivalent: { $eq: [ "$a", "$b" ] }
          }
     }
   ]
)

Hasil:

{ "_id" : 7, "a" : 250, "b" : null, "isEquivalent" : false }
{ "_id" : 8, "a" : null, "b" : null, "isEquivalent" : true }

Bidang Tidak Ada

Jika salah satu bidang yang Anda coba bandingkan tidak ada, $eq mengembalikan false .

Misalkan kita menambahkan dokumen berikut ke koleksi kita:

{ "_id" : 9, "a" : 250 }

Ayo terapkan $eq ke dokumen itu:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 9 ] } } },
     {
       $project:
          {
            a: 1,
            b: 1,
            isEquivalent: { $eq: [ "$a", "$b" ] }
          }
     }
   ]
)

Hasil:

{ "_id" : 9, "a" : 250, "isEquivalent" : false }

Tak Terbatas

Membandingkan Infinity ke Infinity mengembalikan true .

Membandingkan -Infinity ke -Infinity mengembalikan true .

Membandingkan Infinity ke -Infinity mengembalikan false .

Misalkan kita menambahkan dokumen berikut ke koleksi kita:

{ "_id" : 10, "a" : Infinity, "b" : Infinity }
{ "_id" : 11, "a" : -Infinity, "b" : -Infinity }
{ "_id" : 12, "a" : Infinity, "b" : -Infinity }

Ayo terapkan $eq ke dokumen-dokumen itu:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 10, 11, 12 ] } } },
     {
       $project:
          {
            a: 1,
            b: 1,
            isEquivalent: { $eq: [ "$a", "$b" ] }
          }
     }
   ]
)

Hasil:

{ "_id" : 10, "a" : Infinity, "b" : Infinity, "isEquivalent" : true }
{ "_id" : 11, "a" : -Infinity, "b" : -Infinity, "isEquivalent" : true }
{ "_id" : 12, "a" : Infinity, "b" : -Infinity, "isEquivalent" : false }

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Hapus bidang yang ditemukan di array mongodb mana pun

  2. Pembaruan MongoDB Banyak ()

  3. Metode Tanggal MongoDB ()

  4. mongodb dapatkan _id sebagai string dalam permintaan pencarian

  5. Dukungan untuk beberapa tipe pengguna dengan Passport-local luwak node.js