Merancang Skema untuk Melakukan Operasi Sortir di MongoDB

Saya menggunakan Mongoose untuk mendesain skema. Saya memiliki dua koleksi bernama Restoran dan Produk. Saya telah menyimpan semua detail restoran di Koleksi Restoran. Di Koleksi Produk, saya memiliki bidang bernama restaurantCode yang disajikan sebagai _id di Koleksi Restoran dan memetakan keduanya koleksi berhasil. Sekarang di sisi Front-End saya menggunakan Angular 5, saya telah memberikan kendali kepada Pemilik Restoran untuk menyortir produk sesuai keinginannya. Untuk melakukan operasi ini, saya telah membuat bidang baru di koleksi Produk bernama sortIndex dan menetapkan nilai dari 0 hingga jumlah produk yang tersedia per restoran. Memposting data tiruan saya di bawah

Detail Restoran

 1)
_id : "ABC",
"Name" : "Eat Well Restaurant",
 2)
 _id : "DEF",
"Name" : "Eat ALL Restaurant",

Rincian Produk

1)
"name": "Pizza",
"Price": 20,
"restaurantCode" : "ABC",
"sortIndex": 0
2)
"name": "Juice",
"Price": 30,
"restaurantCode" : "ABC",
"sortIndex": 1
3)
"name": "Fruit",
"Price": 20,
"restaurantCode" : "ABC",
"sortIndex": 2 
4)
"name": "Chicken Rice",
"Price": 20,
"restaurantCode" : "DEF",
"sortIndex": 0
5)
"name": "Chicken Fry",
"Price": 20,
"restaurantCode" : "DEF",
"sortIndex": 1
6)
"name": "Chicken Briyani",
"Price": 20,
"restaurantCode" : "DEF",
"sortIndex": 2

Saya menampilkan produk berdasarkan nilai sortIndex. Sekarang, setiap kali pengguna melakukan Operasi pengurutan di sisi ujung depan (Sudut) saya akan menetapkan ulang nilai sortIndex. Masalahnya adalah setiap kali Pemilik Restoran menghapus produk saya harus menetapkan ulang nilai sortIndex untuk semua produk yang terkait dengan restoran tertentu. Saya merasa ini adalah operasi yang mahal. Ini adalah pendekatan yang saya gunakan sampai sekarang dan berfungsi dengan baik. Saya ingin tahu apakah ada pendekatan yang lebih baik untuk masalah ini, saya yakin akan ada pendekatan tersebut. Tumpukan saya adalah NodeJS,Mongoose,MongoDB,Angular(Front-End) Tinggalkan ide/pemikiran Anda. Terima kasih


person Kannan T    schedule 26.03.2018    source sumber


Jawaban (1)


Sepertinya desain Anda seperti itu

var restaurantSchema = new Schema({
    _id: String,
    Name: String
});

var productSchema = new Schema({
    name: String,
    Price: Number,
    restaurantCode: { type: String, ref: 'Restaurant' },
    sortIndex: Number
});

var Restaurant = mongoose.model('Restaurant', restaurantSchema);
var Product = mongoose.model('Product', productSchema);

Jika Anda ingin mempertahankan kedua koleksi tersebut, Anda dapat menambahkan bidang products ke skema Restoran Anda dan menghapus sortIndex di skema Produk Anda. Bidang products ini akan berupa susunan referensi yang diurutkan (tidak diurutkan berdasarkan ID, namun berdasarkan posisinya).

var restaurantSchema = new Schema({
    _id: String,
    Name: String,
    products: [{ type: Schema.Types.ObjectId, ref: 'Product' }] 
});

var productSchema = new Schema({
    name: String,
    Price: Number,
    restaurantCode: { type: String, ref: 'Restaurant' }
});

Saat Anda menyimpan urutan daftar produk untuk restoran tertentu, Anda harus mengirimkan serangkaian semua ID produk sesuai urutan penempatannya.

Saat Anda menghapus suatu produk, Anda akan menghapusnya dari koleksi Produk dan menghapus referensi di restoran terkait. Biasanya, jika Anda mengikuti desain RESTful, rute penghapusan Anda akan menjadi seperti DELETE /restaurants/:rid/products/:pid.

person Mikey    schedule 26.03.2018
comment
Mikey menurut saya ini bukan pendekatan yang bagus karena saya memiliki banyak bidang dalam skema restoran serta skema produk, saya baru saja memposting bidang yang wajib diisi. Bisakah Anda memberi saya/memikirkan ide lain? - person Kannan T; 28.03.2018
comment
@Kannan Mengapa menurut Anda ini pendekatan yang buruk? Pendekatan ini hanya mempertahankan urutan larik referensi products dalam satu dokumen Restoran -- dengan manfaat tambahan dalam hal pengambilan produk. Meskipun demikian, sulit untuk menjawabnya karena saya tidak tahu bagaimana Anda mendesain UI Anda khususnya untuk penyortiran. Apakah Anda mengurutkan + menyimpan satu produk sekaligus ATAU mengurutkan + menyimpan semua produk sekaligus? Apakah Anda juga hanya mengurutkan ATAU mengurutkan + memperbarui kolom lain untuk setiap produk? - person Mikey; 28.03.2018
comment
Bro, saya tidak mengatakan ini adalah pendekatan yang buruk, yang saya katakan adalah ini bukan pendekatan yang baik untuk masalah saya. Saya sudah memiliki 1000 restoran dan masing-masing restoran memiliki setidaknya 100 produk, jadi memisahkan koleksi adalah ide bagus bagi saya. Dan sebuah produk memiliki 25 bidang dan akan sangat sulit untuk disimpan ke dalam satu koleksi. - person Kannan T; 28.03.2018
comment
Saya melakukan pengurutan melalui nilai bidang (sortIndex) pengguna menyeret dan melepas produk. Saya akan mendapatkan nilai sortIndex dan saya akan mengubah sortIndex produk tersebut. - person Kannan T; 28.03.2018