Dengan asumsi item dalam products
Anda array unik, tidak ada dukungan sisi server yang mudah untuk mempertahankan array ini dalam urutan yang diurutkan seperti pada MongoDB 2.4. Pilihan terbaik Anda mengingat array bersarang adalah mengurutkan array dalam logika aplikasi Anda sebagaimana mestinya (yaitu pada sisipan/pembaruan, atau pada pengambilan/tampilan).
Pertimbangan Pemodelan Data
Jika Anda perlu melakukan banyak manipulasi entri array bersarang, Anda harus mempertimbangkan untuk meratakan model data Anda agar lebih mudah digunakan. Tujuan desain Anda dengan MongoDB adalah memiliki model data yang sesuai untuk kasus penggunaan aplikasi Anda dengan keseimbangan kinerja yang dapat diterima antara kemudahan penyisipan/pembaruan/kueri. Anda pasti tidak harus memodelkan semuanya dalam satu koleksi/kueri jika tidak masuk akal untuk melakukannya, dan Anda harus siap untuk mendenormalisasi (menggandakan) data. Untuk hubungan banyak-ke-banyak seperti produk <=> kategori, biasanya untuk menyematkan dan mendenormalisasi entitas mana pun yang lebih jarang diperbarui (misalnya, menyematkan kategori dalam produk).
Array yang diurutkan dan dibatasi (item non-unik)
Jika Anda ingin mempertahankan array dalam urutan yang diurutkan dan item tidak unik, MongoDB 2.4 memiliki opsi untuk $push
ke array yang diurutkan tetapi ini harus digunakan bersama dengan irisan (batas array). Jika Anda $push
entri identik ke array yang diurutkan Anda akan berakhir dengan duplikat (jadi ini mungkin bukan yang Anda cari).
Contoh pembaruan, dengan asumsi page
dalam contoh Anda adalah nama koleksi:
db.page.update(
// Query
{ "_id": "56rgt46rt54h68rt4h6" },
// Update sorted array
// NB: referring by array index position 0, as there isn't a named reference
{ $push : {
"categories.0.products" : {
// List of new elements to push
$each : [
{ "name" : "E", "pos": 3 }
],
// Sort by pos (ascending)
$sort : { "pos" : 1 },
// Maximum number of array elements (required for $sort)
$slice : -100
}
}}
)