设计Schema以在MongoDB上执行排序操作

时间:2018-03-26 19:05:35

标签: node.js angular mongodb mongoose

使用Mongoose设计架构。我有两个名为餐馆产品的馆藏。我一直在Restaurant Collection收集所有餐厅的详细信息。在产品集合中,我有一个名为 restaurantCode 的字段,在餐厅集合中显示为 _id 并映射到收藏成功。现在在前端使用Angular 5,我已经控制了Restuarant所有者按照他们的意愿对产品进行排序。为了执行此操作,我在产品集合中创建了一个名为 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值显示产品。现在,每当用户在前端(Angular)执行排序操作时,我将重新分配sortIndex值。问题是每当餐馆老板删除产品时,我必须为与特定餐馆相关联的所有产品重新分配sortIndex值。我觉得这是一项昂贵的操作。这是我一直使用的方法,它工作正常。我想知道有没有更好的方法解决这个问题,我相信会有一个。我的堆栈是NodeJS,Mongoose,MongoDB,Angular(前端)留下你的想法/想法。谢谢

1 个答案:

答案 0 :(得分: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' }
});

当您保存特定餐厅的产品列表的排序顺序时,您必须按照它们的顺序发送所有产品ID的数组。

删除产品时,您将从Products集合中删除它,并删除相关餐厅中的引用。通常,如果您遵循RESTful设计,您的删除路线将类似于DELETE /restaurants/:rid/products/:pid