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 :
example@sqldat.com/mongo/shell/utils.js:25:13
example@sqldat.com/mongo/shell/assert.js:18:14
example@sqldat.com/mongo/shell/assert.js:639:17
example@sqldat.com/mongo/shell/assert.js:729:16
example@sqldat.com/mongo/shell/db.js:266:5
example@sqldat.com/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 :
example@sqldat.com/mongo/shell/utils.js:25:13
example@sqldat.com/mongo/shell/assert.js:18:14
example@sqldat.com/mongo/shell/assert.js:639:17
example@sqldat.com/mongo/shell/assert.js:729:16
example@sqldat.com/mongo/shell/db.js:266:5
example@sqldat.com/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 :
example@sqldat.com/mongo/shell/utils.js:25:13
example@sqldat.com/mongo/shell/assert.js:18:14
example@sqldat.com/mongo/shell/assert.js:639:17
example@sqldat.com/mongo/shell/assert.js:729:16
example@sqldat.com/mongo/shell/db.js:266:5
DBCoexample@sqldat.com/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 :
example@sqldat.com/mongo/shell/utils.js:25:13
example@sqldat.com/mongo/shell/assert.js:18:14
example@sqldat.com/mongo/shell/assert.js:639:17
example@sqldat.com/mongo/shell/assert.js:729:16
example@sqldat.com/mongo/shell/db.js:266:5
example@sqldat.com/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 .