【问题标题】:Designing Schema to Perform Sort Operation on MongoDB设计 Schema 以在 MongoDB 上执行排序操作
【发布时间】:2018-09-05 00:48:17
【问题描述】:

我正在使用 Mongoose 来设计模式。我有两个名为 RestaurantsProducts 的集合。我一直在 Restaurant Collection 中存储所有餐厅的详细信息。在 Products 集合中,我有一个名为 restaurantCode 的字段,它在 Restaurant 集合中显示为 _id 并映射了两者收藏成功。现在在前端使用 Angular 5,我已经将控制权交给了餐厅老板,让他们按照他们的意愿对产品进行分类。为了执行此操作,我在 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(Front-End) 留下你的想法/想法。谢谢

【问题讨论】:

    标签: node.js angular mongodb mongoose


    【解决方案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

    【讨论】:

    • Mikey 我认为这不是一个好的方法,因为我在餐厅模式和产品模式中有很多字段,我刚刚发布了必填字段。你能给我/想一个其他的想法吗?
    • @Kannan 为什么你认为这是一个不好的方法?这种方法只是在 one Restaurant 文档中维护products 引用数组的顺序——在获取相关products 方面有额外的好处。不过,这很难回答,因为我不知道您是如何设计 UI 的,特别是用于排序。您是一次排序 + 保存 一个 产品还是一次排序 + 保存 所有 产品?您是否也排序或排序 + 更新每个产品的其他字段?
    • 兄弟我并不是说这是一种不好的方法,而是说这不是解决我的问题的好方法。我已经有 1000 家餐厅,每家至少有 100 种产品,所以分开收集对我来说是个好主意。而且一个产品本身有 25 个字段,很难存储到一个集合中。
    • 我通过字段值(sortIndex)执行排序,用户拖放产品我将获得 sortIndex 值,我将更改这些产品的 sortIndex。
    猜你喜欢
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 2013-08-27
    • 2021-07-06
    相关资源
    最近更新 更多