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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计Schema以在MongoDB上执行排序操作相关的知识,希望对你有一定的参考价值。

我使用Mongoose来设计模式。我有两个名为餐馆和产品的系列。我一直在Restaurant Collection收集所有餐厅的详细信息。在Products Collection中,我有一个名为restaurantCode的字段,它在Restaurant Collection中以_id形式显示,并成功映射了两个集合。现在在前端使用Angular 5,我已经控制了Restuarant所有者按照他们的意愿对产品进行排序。为了执行此操作,我在Products集合中创建了一个名为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(前端)留下你的想法/想法。谢谢

答案

看来你的设计是这样的

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

以上是关于设计Schema以在MongoDB上执行排序操作的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB 实用数组聚合操作 (2)

应用Mongoose开发MongoDB模型(models)

mongodb模式模型设计及编码-Mongoose

MongoDB Schema Design - 实时聊天

PySpark local模式执行读取mongodb报错 Exception: Java gateway process exited before sending its port number(代

MongoDB实战-面向文档的数据(找到最合适的数据建模方式)