Di MongoDB, $slice
operator pipeline agregasi mengembalikan subset array.
Untuk menggunakan $slice
, Anda menentukan jumlah elemen yang akan dikembalikan dari larik. Anda juga dapat menentukan posisi awal untuk mengambil subset dari larik.
Contoh
Misalkan kita memiliki koleksi yang disebut test
dengan dokumen berikut:
{ "_id" : 1, "data" : [ "Aardvark", "Buffalo", "Cat", "Dog", "Horse", "Gorilla", "Zebra" ] }
Kita bisa menggunakan $slice
untuk mengambil subset dari array di data
lapangan.
Bilangan Bulat Positif
Memberikan satu nilai positif menentukan posisi awal dari awal larik.
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 3 ] }
}
}
]
)
Hasil:
{ "result" : [ "Aardvark", "Buffalo", "Cat" ] }
Dalam hal ini, kami memberikan angka positif 3
, dan tiga elemen pertama yang dikembalikan dari larik.
Bilangan Bulat Negatif
Memberikan nilai negatif tunggal menentukan posisi awal dari akhir dari larik.
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -3 ] }
}
}
]
)
Hasil:
{ "result" : [ "Horse", "Gorilla", "Zebra" ] }
Dalam hal ini kami mengembalikan tiga elemen terakhir dari larik.
Perhatikan bahwa Anda tidak dapat menentukan bilangan bulat negatif saat Anda juga menentukan posisi awal. Lebih lanjut tentang ini nanti.
Tentukan Posisi Awal
Anda juga memiliki pilihan untuk menentukan posisi awal. Untuk melakukannya, berikan bilangan bulat lain sebelum yang lain.
Bilangan Bulat Positif
Berikut adalah contoh penggunaan bilangan bulat positif untuk posisi awal:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 2, 3 ] }
}
}
]
)
Hasil:
{ "result" : [ "Cat", "Dog", "Horse" ] }
Dalam hal ini kami menentukan posisi awal 2
dan ukuran irisan 3
.
Perhatikan bahwa array berbasis nol, dan oleh karena itu bilangan bulat positif kami 2
mengakibatkan operasi irisan dimulai dari posisi ketiga.
Bilangan Bulat Negatif
Berikut ini contoh penggunaan bilangan bulat negatif untuk posisi awal:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -4, 3 ] }
}
}
]
)
Hasil:
{ "result" : [ "Dog", "Horse", "Gorilla" ] }
Dalam hal ini, kami menetapkan -4
, yang mengakibatkan operasi irisan menghitung mundur empat tempat dari akhir.
Irisan Besar
Memberikan ukuran irisan yang lebih besar dari elemen yang tersedia dalam larik hanya akan menghasilkan elemen larik yang tersisa.
Contoh:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -1, 3 ] }
}
}
]
)
Hasil:
{ "result" : [ "Zebra" ] }
Di sini kami menetapkan bahwa tiga elemen harus dikembalikan, meskipun kami hanya memulai satu posisi kembali dari akhir array. Dalam hal ini, hanya satu elemen yang dikembalikan (yang terakhir dalam larik).
Di Luar Jangkauan Posisi Awal
Memberikan posisi awal yang berada di luar jangkauan larik dapat mengembalikan beberapa elemen atau larik kosong. Itu semua tergantung pada nilai yang diberikan.
Berikut adalah contoh yang mengembalikan array kosong:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 10, 3 ] }
}
}
]
)
Hasil:
{ "result" : [ ] }
Ini mengembalikan array kosong karena posisi awalnya adalah 10
, meskipun hanya ada 7
elemen dalam array (dan hitungan akan beralih dari 0
ke 6
).
Namun, jika kami memberikan nilai negatif yang lebih besar dari ukuran larik, irisan dimulai dari awal larik.
Contoh:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -10, 3 ] }
}
}
]
)
Hasil:
{ "result" : [ "Aardvark", "Buffalo", "Cat" ] }
Slice Negatif dengan Posisi Awal
Seperti yang disebutkan, Anda tidak dapat menentukan bilangan bulat negatif saat Anda juga menentukan posisi awal. Melakukan ini menghasilkan kesalahan.
Contoh:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 4, -3 ] }
}
}
]
)
Hasil:
Error: command failed: { "ok" : 0, "errmsg" : "Third argument to $slice must be positive: -3", "code" : 28729, "codeName" : "Location28729" } : 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