การออกแบบ Schema เพื่อดำเนินการเรียงลำดับบน MongoDB

ฉันกำลังใช้ Mongoose เพื่อออกแบบสคีมา ฉันมีสองคอลเลกชันชื่อ ร้านอาหาร และ ผลิตภัณฑ์ ฉันได้จัดเก็บรายละเอียดร้านอาหารทั้งหมดไว้ใน Restaurant Collection ในคอลเลกชัน ผลิตภัณฑ์ ฉันมีช่องชื่อ รหัสร้านอาหาร ซึ่งแสดงเป็น _id ในคอลเลกชัน ร้านอาหาร และแมปทั้งคู่ คอลเลกชันได้สำเร็จ ตอนนี้ Front-End กำลังใช้ Angular 5 ฉันได้ให้การควบคุมแก่เจ้าของร้านอาหารในการจัดเรียงสินค้าตามความต้องการ เพื่อดำเนินการนี้ ฉันได้สร้างฟิลด์ใหม่ในคอลเลกชัน ผลิตภัณฑ์ ชื่อ sortIndex และกำหนดค่าตั้งแต่ 0 ไปจนถึงจำนวนผลิตภัณฑ์ที่มีจำหน่ายต่อร้านอาหาร โพสต์ข้อมูลจำลองของฉันด้านล่าง

รายละเอียดร้านอาหาร

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

รายละเอียดสินค้า

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

กำลังแสดงผลิตภัณฑ์ตามค่า sortIndex ตอนนี้เมื่อใดก็ตามที่ผู้ใช้ดำเนินการเรียงลำดับที่ส่วนหน้า (เชิงมุม) ฉันจะกำหนดค่า sortIndex อีกครั้ง ปัญหาคือเมื่อใดก็ตามที่เจ้าของร้านอาหารลบผลิตภัณฑ์ ฉันจะต้องกำหนดค่า sortIndex ใหม่สำหรับผลิตภัณฑ์ทั้งหมดที่เกี่ยวข้องกับร้านอาหารนั้น ๆ ฉันรู้สึกว่ามันเป็นการผ่าตัดที่มีค่าใช้จ่ายสูง นี่เป็นแนวทางที่ฉันใช้มาจนถึงตอนนี้และใช้งานได้ดี ฉันอยากรู้ว่ามีวิธีใดที่ดีกว่าในการแก้ไขปัญหานี้หรือไม่ และแน่นอนว่าจะมีวิธีใดวิธีหนึ่ง สแต็กของฉันคือ NodeJS, Mongoose, MongoDB, Angular (Front-End) ฝากความคิด/ความคิดของคุณไว้ ขอบคุณ


person Kannan T    schedule 26.03.2018    source แหล่งที่มา


คำตอบ (1)


ดูเหมือนว่าการออกแบบของคุณจะเป็นเช่นนั้น

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);

หากคุณต้องการเก็บทั้งสองคอลเลกชัน คุณสามารถเพิ่มฟิลด์ products ลงในสคีมาร้านอาหารของคุณแทน และยกเลิกด้วย sortIndex ในสคีมาผลิตภัณฑ์ของคุณ ฟิลด์ products นี้จะเป็นอาร์เรย์ของการอ้างอิงที่เรียงลำดับ (ไม่เรียงลำดับตาม ID แต่ตามตำแหน่ง)

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' }
});

เมื่อคุณบันทึกลำดับการจัดเรียงรายการผลิตภัณฑ์สำหรับร้านอาหารแห่งใดแห่งหนึ่ง คุณจะต้องส่งอาร์เรย์ของรหัสผลิตภัณฑ์ทั้งหมดตามลำดับที่วางไว้

เมื่อคุณลบผลิตภัณฑ์ คุณจะลบออกจากคอลเลกชันผลิตภัณฑ์และลบข้อมูลอ้างอิงในร้านอาหารที่เกี่ยวข้อง โดยปกติ หากคุณทำตามการออกแบบ RESTful เส้นทางการลบของคุณจะเป็นเช่น DELETE /restaurants/:rid/products/:pid

person Mikey    schedule 26.03.2018
comment
ไมค์กี้ ฉันไม่คิดว่านี่จะเป็นแนวทางที่ดี เนื่องจากฉันมีหลายสาขาในสคีมาร้านอาหารและในสคีมาผลิตภัณฑ์ ฉันเพิ่งโพสต์ช่องที่ต้องกรอก คุณช่วยบอกฉัน / คิดแนวคิดอื่นได้ไหม? - person Kannan T; 28.03.2018
comment
@Kannan ทำไมคุณถึงคิดว่ามันเป็นแนวทางที่ไม่ดี? วิธีการนี้จะรักษาลำดับของอาร์เรย์อ้างอิง products ในเอกสารร้านอาหาร หนึ่ง -- พร้อมสิทธิประโยชน์เพิ่มเติมในแง่ของการดึงข้อมูล ผลิตภัณฑ์ แม้ว่าจะตอบได้ยากเนื่องจากฉันไม่รู้ว่าคุณออกแบบ UI ของคุณเพื่อการเรียงลำดับโดยเฉพาะอย่างไร คุณเรียงลำดับ + บันทึกผลิตภัณฑ์ หนึ่งรายการ ในแต่ละครั้ง หรือ จัดเรียง + บันทึกผลิตภัณฑ์ ทั้งหมด ในแต่ละครั้งหรือไม่ คุณเพียงจัดเรียงหรือจัดเรียง + อัปเดตฟิลด์อื่นๆ สำหรับแต่ละผลิตภัณฑ์หรือไม่ - person Mikey; 28.03.2018
comment
พี่ชายไม่ได้บอกว่านี่เป็นแนวทางที่ไม่ดีเลย สิ่งที่ฉันบอกว่านี่ไม่ใช่แนวทางที่ดีสำหรับปัญหาของฉัน ฉันมีร้านอาหารอยู่แล้ว 1,000 แห่งและแต่ละร้านมีผลิตภัณฑ์อย่างน้อย 100 รายการ ดังนั้นการแยกคอลเลกชันจึงเป็นความคิดที่ดีสำหรับฉัน และผลิตภัณฑ์มี 25 ช่อง และเป็นการยากมากที่จะจัดเก็บไว้ในคอลเลกชันเดียว - person Kannan T; 28.03.2018
comment
กำลังทำการเรียงลำดับผ่านค่าฟิลด์ (sortIndex) โดยผู้ใช้ลากและวางผลิตภัณฑ์ ฉันจะได้รับทั้งค่า sortIndex และฉันจะเปลี่ยน sortIndex ของผลิตภัณฑ์เหล่านั้น - person Kannan T; 28.03.2018