Di MongoDB, $pow
operator pipa agregasi menaikkan angka ke eksponen yang ditentukan dan mengembalikan hasilnya
$pow
menerima dua ekspresi, disediakan dalam array. Yang pertama adalah angkanya, dan yang kedua adalah eksponennya. Keduanya dapat berupa ekspresi apa pun yang valid, selama keduanya menghasilkan angka.
Contoh
Misalkan kita memiliki koleksi yang disebut test
dengan dokumen sebagai berikut:
{ "_id" : 1, "data" : 10 } { "_id" : 2, "data" : -3 } { "_id" : 3, "data" : 0 } { "_id" : 4, "data" : null }
Kita dapat menggunakan $pow
operator untuk menaikkan data
bidang oleh eksponen tertentu:
db.test.aggregate(
[
{ $project: {
_id: 0,
result: { $pow: [ "$data", 3 ] }
}
}
]
)
Hasil:
{ "result" : 1000 } { "result" : -27 } { "result" : 0 } { "result" : null }
Dalam hal ini, saya menggunakan data
bidang sebagai nomor, dan 3
sebagai eksponen. Oleh karena itu, setiap dokumen memiliki data
medan yang dibangkitkan oleh kekuatan 3.
Kita dapat melihat bahwa null
nilai mengembalikan null
.
Hasilnya biasanya jenis yang sama dengan input. Namun, ada pengecualian untuk aturan ini. Khususnya:
- Integer 32-bit akan dikonversi menjadi integer 64-bit jika hasilnya dapat direpresentasikan sebagai integer 64-bit.
- Integer 32-bit akan dikonversi menjadi double jika hasilnya tidak dapat direpresentasikan sebagai integer 64-bit.
- Integer 64-bit akan dikonversi menjadi dua kali lipat jika hasilnya tidak dapat direpresentasikan sebagai integer 64-bit.
Eksponen Negatif
Anda tidak dapat menaikkan nol (0
) ke eksponen negatif.
Contoh:
db.test.aggregate(
[
{ $match: { _id: 3 } },
{ $project: {
_id: 0,
result: { $pow: [ "$data", -3 ] }
}
}
]
)
Hasil:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$pow cannot take a base of 0 and a negative exponent", "code" : 28764, "codeName" : "Location28764" } : 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
Kesalahan secara eksplisit menyatakan bahwa “$pow tidak dapat mengambil basis 0 dan eksponen negatif “.
Namun, jika kami mengecualikan dokumen 3, kami tidak lagi mendapatkan kesalahan:
db.test.aggregate(
[
{ $match: { _id: { $nin: [ 3 ] } } },
{ $project: {
result: { $pow: [ "$data", -3 ] }
}
}
]
)
Hasil:
{ "_id" : 1, "result" : 0.001 } { "_id" : 2, "result" : -0.037037037037037035 } { "_id" : 4, "result" : null }
Nilai NaN
Jika argumen diselesaikan menjadi NaN
, $pow
mengembalikan NaN
.
Contoh:
db.test.aggregate(
[
{ $project: {
_id: 0,
result: { $pow: [ "$data" * 1, 3 ] }
}
}
]
)
Hasil:
{ "result" : NaN } { "result" : NaN } { "result" : NaN } { "result" : NaN }
Bidang Tidak Ada
Jika $pow
operator diterapkan pada bidang yang tidak ada, null
dikembalikan.
Contoh:
db.test.aggregate(
[
{ $project: {
_id: 0,
result: { $pow: [ "$beer", 3 ] }
}
}
]
)
Hasil:
{ "result" : null } { "result" : null } { "result" : null } { "result" : null }
Eksponen Null
Kami telah melihat bahwa null
nilai mengembalikan null
. Hal ini juga berlaku saat memberikan null
sebagai eksponen.
Contoh:
db.test.aggregate(
[
{ $project: {
_id: 0,
result: { $pow: [ "$data", null ] }
}
}
]
)
Hasil:
{ "result" : null } { "result" : null } { "result" : null } { "result" : null }