Di MongoDB, $mod
operator pipa agregasi membagi satu angka dengan angka lainnya dan mengembalikan sisanya.
Untuk menggunakan $mod
, berikan dua angka dalam larik. $mod
operator akan membagi angka pertama dengan angka kedua dan mengembalikan sisanya. Dengan kata lain, angka pertama adalah pembagian, dan angka kedua adalah pembagi.
Argumen dapat berupa ekspresi apa pun yang valid selama argumen tersebut menghasilkan angka.
Contoh
Misalkan kita memiliki koleksi yang disebut data
dengan dokumen sebagai berikut:
{ "_id" : 1, "a" : 10, "b" : 2 } { "_id" : 2, "a" : 10, "b" : 3 } { "_id" : 3, "a" : 10.5, "b" : 2 }
Kita dapat menggunakan $mod
operator dalam pipa agregasi untuk membagi a
bidang dengan b
bidang, dan kembalikan sisanya:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$a", "$b" ] } }
}
]
)
Hasil:
{ "a" : 10, "b" : 2, "result" : 0 } { "a" : 10, "b" : 3, "result" : 1 } { "a" : 10.5, "b" : 2, "result" : 0.5 }
Dengan kata lain, kita mendapatkan a
modulo b
.
Jika kita ingin mendapatkan b
modulo a
, kita perlu menukarnya.
Contoh:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$b", "$a" ] } }
}
]
)
Hasil:
{ "a" : 10, "b" : 2, "result" : 2 } { "a" : 10, "b" : 3, "result" : 3 } { "a" : 10.5, "b" : 2, "result" : 2 }
Bilangan Negatif
Misalkan kita menambahkan dokumen berikut ke koleksi kita:
{ "_id" : 4, "a" : -10, "b" : 3 } { "_id" : 5, "a" : 10, "b" : -3 } { "_id" : 6, "a" : -10, "b" : -3 }
Ini termasuk angka negatif. Tapi itu tidak masalah, karena bilangan negatif tetaplah bilangan, dan kita pasti bisa mendapatkan modulo saat bekerja dengan bilangan negatif.
Contoh:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 4, 5, 6 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$a", "$b" ] } }
}
]
)
Hasil:
{ "a" : -10, "b" : 3, "result" : -1 } { "a" : 10, "b" : -3, "result" : 1 } { "a" : -10, "b" : -3, "result" : -1 }
Jenis Data Salah
Argumen yang diberikan kepada $mod
dapat berupa ekspresi apa pun yang valid, selama ekspresi tersebut menghasilkan angka.
Misalkan kita memiliki dokumen berikut:
{ "_id" : 7, "a" : "Ten", "b" : 2 }
Dan kami menerapkan $mod
ke dokumen itu:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$a", "$b" ] } }
}
]
)
Hasil:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$mod only supports numeric types, not string and double", "code" : 16611, "codeName" : "Location16611" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:639:17 [email protected]/mongo/shell/assert.js:729:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1058:12 @(shell):1:1
Kesalahan menyatakan bahwa $mod only supports numeric types
.
Nilai Null
Memberikan null
untuk salah satu argumen mengembalikan null
.
Misalkan kita memiliki dokumen berikut:
{ "_id" : 8, "a" : 10, "b" : null } { "_id" : 9, "a" : null, "b" : 10 } { "_id" : 10, "a" : null, "b" : null }
Dan kami menerapkan $mod
ke dokumen-dokumen itu:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 8, 9, 10 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$a", "$b" ] } }
}
]
)
Hasil:
{ "a" : 10, "b" : null, "result" : null } { "a" : null, "b" : 10, "result" : null } { "a" : null, "b" : null, "result" : null }
Bidang Tidak Ada
Bidang yang hilang mengembalikan null
.
Misalkan kita memiliki dokumen berikut:
{ "_id" : 11, "a" : 10 } { "_id" : 12, "b" : 2 } { "_id" : 13 }
Terapkan $mod
:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 11, 12, 13 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$a", "$b" ] } }
}
]
)
Hasil:
{ "a" : 10, "result" : null } { "b" : 2, "result" : null } { "result" : null }
Tambahkan Nomor Anda Sendiri
Anda tidak perlu dibatasi hanya pada angka-angka dalam dokumen. Anda dapat menggunakan nomor Anda sendiri jika Anda perlu membagi bidang dengan jumlah yang tetap.
Contoh:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$a", 5.2 ] } }
}
]
)
Hasil:
{ "a" : 10, "b" : 2, "result" : 4.8 } { "a" : 10, "b" : 3, "result" : 4.8 } { "a" : 10.5, "b" : 2, "result" : 0.09999999999999964 }