Di MongoDB, $range
operator pipeline agregasi mengembalikan urutan angka yang dihasilkan dalam larik.
Urutan angka ini didasarkan pada nilai input yang Anda berikan.
Sintaks
Sintaksnya seperti ini:
{ $range: [ <start>, <end>, <non-zero step> ] }
Dimana <start>
adalah awal dan <end>
adalah akhir dari urutan. Masing-masing dapat berupa ekspresi valid apa pun yang diselesaikan ke bilangan bulat.
<non-zero step>
adalah argumen opsional yang default ke 1. Argumen ini memungkinkan Anda untuk menentukan nilai kenaikan. Jika disediakan, itu harus berupa ekspresi valid yang menghasilkan bilangan bulat bukan nol.
Contoh
Misalkan kita memiliki koleksi yang disebut range
dengan dokumen sebagai berikut:
{ "_id" : 1, "start" : 0, "end" : 5 } { "_id" : 2, "start" : 1, "end" : 5 }
Kita dapat menggunakan $range
operator untuk mengembalikan array berdasarkan nilai dalam dokumen tersebut.
db.range.aggregate(
[
{ $match: { _id: { $in: [ 1, 2 ] } } },
{
$project:
{
_id: 0,
start: 1,
end: 1,
result: { $range: [ "$start", "$end" ] }
}
}
]
)
Hasil:
{ "start" : 0, "end" : 5, "result" : [ 0, 1, 2, 3, 4 ] } { "start" : 1, "end" : 5, "result" : [ 1, 2, 3, 4 ] }
Dalam hal ini, kami tidak memberikan argumen ketiga, jadi $range
menggunakan nilai langkah default 1. Oleh karena itu, elemen array bertambah 1.
Tambahkan Peningkatan Eksplisit
Kita dapat menambahkan argumen ketiga untuk secara eksplisit menentukan berapa banyak setiap elemen array harus bertambah.
Misalkan koleksi kami berisi dokumen-dokumen berikut:
{ "_id" : 3, "start" : 0, "end" : 5, "step" : 1 } { "_id" : 4, "start" : 0, "end" : 10, "step" : 2 } { "_id" : 5, "start" : 1, "end" : 10, "step" : 2 } { "_id" : 6, "start" : 100, "end" : 150, "step" : 10 }
Dokumen-dokumen ini memiliki step
bidang, sehingga kita dapat menggunakan bidang itu untuk nilai yang bertambah untuk masing-masing dokumen.
Sekarang mari kita terapkan $range
ke dokumen tersebut, dan sertakan step
field sebagai argumen ketiga:
db.range.aggregate(
[
{ $match: { _id: { $in: [ 3, 4, 5, 6 ] } } },
{
$project:
{
_id: 0,
start: 1,
end: 1,
step: 1,
result: { $range: [ "$start", "$end", "$step" ] }
}
}
]
)
Hasil:
{ "start" : 0, "end" : 5, "step" : 1, "result" : [ 0, 1, 2, 3, 4 ] } { "start" : 0, "end" : 10, "step" : 2, "result" : [ 0, 2, 4, 6, 8 ] } { "start" : 1, "end" : 10, "step" : 2, "result" : [ 1, 3, 5, 7, 9 ] } { "start" : 100, "end" : 150, "step" : 10, "result" : [ 100, 110, 120, 130, 140 ] }
Nilai Langkah Negatif
Langkah dapat bernilai negatif, meskipun ini perlu dilakukan dalam konteks penurunan dari start
yang lebih tinggi nomor ke end
yang lebih rendah nomor.
Mari tambahkan beberapa dokumen lagi ke koleksi kami:
{ "_id" : 7, "start" : 0, "end" : 5, "step" : -1 } { "_id" : 8, "start" : 5, "end" : 0, "step" : -1 } { "_id" : 9, "start" : 0, "end" : -5, "step" : -1 }
Sekarang mari kita terapkan $range
ke dokumen-dokumen itu:
db.range.aggregate(
[
{ $match: { _id: { $in: [ 7, 8, 9 ] } } },
{
$project:
{
_id: 0,
start: 1,
end: 1,
step: 1,
result: { $range: [ "$start", "$end", "$step" ] }
}
}
]
)
Hasil:
{ "start" : 0, "end" : 5, "step" : -1, "result" : [ ] } { "start" : 5, "end" : 0, "step" : -1, "result" : [ 5, 4, 3, 2, 1 ] } { "start" : 0, "end" : -5, "step" : -1, "result" : [ 0, -1, -2, -3, -4 ] }
Kita dapat melihat bahwa dokumen pertama mengembalikan array kosong karena nilai langkah negatif berada di luar rentang yang disediakan oleh start
dan end
bidang.
Namun, dokumen berikutnya menghasilkan rentang nilai yang semakin menurun.
Saat Langkahnya Nol
Nilai langkah harus berupa bilangan bulat bukan nol. Memberikan langkah 0
mengembalikan kesalahan.
Misalkan kita menambahkan dokumen berikut ke koleksi kita:
{ "_id" : 10, "start" : 1, "end" : 5, "step" : 0 }
Inilah yang terjadi ketika kita menerapkan $range
ke dokumen itu:
db.range.aggregate(
[
{ $match: { _id: { $in: [ 10 ] } } },
{
$project:
{
_id: 0,
start: 1,
end: 1,
result: { $range: [ "$start", "$end", "$step" ] }
}
}
]
)
Hasil:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$range requires a non-zero step value", "code" : 34449, "codeName" : "Location34449" } : 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
Pesan kesalahan secara eksplisit memberi tahu kita bahwa $range requires a non-zero step value
.
Langkah Null
Langkahnya tidak boleh null
baik.
Misalkan kita memiliki dokumen berikut:
{ "_id" : 11, "start" : 1, "end" : 5, "step" : null }
Dan kami menerapkan $range
untuk itu:
db.range.aggregate(
[
{ $match: { _id: { $in: [ 11 ] } } },
{
$project:
{
_id: 0,
start: 1,
end: 1,
result: { $range: [ "$start", "$end", "$step" ] }
}
}
]
)
Hasil:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$range requires a numeric step value, found value of type:null", "code" : 34447, "codeName" : "Location34447" } : 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
Ini memberitahu kita bahwa $range requires a numeric step value, found value of type:null
.
Rentang Null
Jika start
dan/atau end
kolom adalah null
, maka kesalahan akan ditampilkan.
Misalkan kita memiliki dokumen berikut:
{ "_id" : 11, "start" : 1, "end" : 5, "step" : null }
Dan terapkan $range
untuk itu:
db.range.aggregate(
[
{ $match: { _id: { $in: [ 11 ] } } },
{
$project:
{
_id: 0,
start: 1,
end: 1,
result: { $range: [ "$start", "$end", "$step" ] }
}
}
]
)
Hasil:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$range requires a numeric starting value, found value of type: null", "code" : 34443, "codeName" : "Location34443" } : 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
Ini memberitahu kita bahwa $range requires a numeric starting value, found value of type: null
.
Pesan serupa akan muncul jika nilai akhir adalah nol.
Ini adalah dokumen dengan null
nilai akhir:
{ "_id" : 13, "start" : 1, "end" : null, "step" : 1 }
Ayo terapkan $range
:
db.range.aggregate(
[
{ $match: { _id: { $in: [ 13 ] } } },
{
$project:
{
_id: 0,
start: 1,
end: 1,
result: { $range: [ "$start", "$end", "$step" ] }
}
}
]
)
Hasil:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$range requires a numeric ending value, found value of type: null", "code" : 34445, "codeName" : "Location34445" } : 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
Kali ini memberitahu kita bahwa $range requires a numeric ending value, found value of type: null
.