You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于MongoDB与Mongoose设计支持产品自定义排序的Schema咨询

Custom Product Sorting for Restaurant Owners with Mongoose & Angular 5

Hey there! Let's work through adding that custom product sorting feature you need. Given your existing setup where Products link to Restaurants via restaurantCode (mapped to the Restaurant's _id), here are two practical approaches to refine your Mongoose schemas and make the sorting work seamlessly:


Approach 1: Add a sortOrder Field to the Products Schema

This is the most straightforward method—we'll add a numeric field directly to each product to track its position in the restaurant's custom order.

Updated Products Schema

const mongoose = require('mongoose');

const productSchema = new mongoose.Schema({
  // Your existing product fields (name, price, description, etc.)
  name: String,
  price: Number,
  description: String,
  restaurantCode: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Restaurant',
    required: true
  },
  // New field for custom sorting
  sortOrder: {
    type: Number,
    default: 0 // Default to 0; use Date.now() instead if you want new products to auto-sort last
  }
});

module.exports = mongoose.model('Product', productSchema);

How It Works

  • When a restaurant owner reorders products (via your Angular 5 UI), send the updated sortOrder values for each product to your backend API.
  • Use Mongoose's bulk operations to efficiently save the new order:
    // Example: Update multiple products at once
    const updateSortOrders = async (productOrderUpdates) => {
      const bulkOps = productOrderUpdates.map(update => ({
        updateOne: {
          filter: { _id: update.productId },
          update: { $set: { sortOrder: update.newSortOrder } }
        }
      }));
      await Product.bulkWrite(bulkOps);
    };
    
  • When fetching products for a restaurant, sort them by sortOrder to match the custom arrangement:
    const getRestaurantProductsSorted = async (restaurantId) => {
      return await Product.find({ restaurantCode: restaurantId })
        .sort({ sortOrder: 1 }) // 1 for ascending (top to bottom), -1 for descending
        .exec();
    };
    

Approach 2: Store Sort Order in the Restaurants Schema

If you prefer to keep product-specific data clean, you can store an ordered array of product IDs directly in the Restaurant document to track the custom sort.

Updated Restaurants Schema

const mongoose = require('mongoose');

const restaurantSchema = new mongoose.Schema({
  // Your existing restaurant fields (name, address, etc.)
  name: String,
  address: String,
  // New array to track custom product order
  productOrder: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Product'
  }]
});

module.exports = mongoose.model('Restaurant', restaurantSchema);

How It Works

  • When the owner finishes reordering products, send the new array of product IDs (in sorted order) to your backend, then update the restaurant's productOrder field:
    const updateProductOrder = async (restaurantId, newProductOrder) => {
      await Restaurant.findByIdAndUpdate(
        restaurantId,
        { $set: { productOrder: newProductOrder } },
        { new: true } // Return the updated restaurant document
      );
    };
    
  • To fetch products in the custom order, populate the productOrder array—this will return products exactly in the stored order:
    const getRestaurantProductsSorted = async (restaurantId) => {
      const restaurant = await Restaurant.findById(restaurantId)
        .populate('productOrder')
        .exec();
      // The populated array is already in the custom sort order
      return restaurant.productOrder;
    };
    

Angular 5 Frontend Tips

  • Use @angular/cdk/drag-drop (compatible with Angular 5) to add intuitive drag-and-drop sorting to your product list UI.
  • When the user completes sorting, collect either the updated sortOrder values for each product or the reordered array of product IDs, then send a POST/PUT request to your backend to persist changes.
  • After saving successfully, refetch the sorted products to refresh the UI and confirm the new order.

Key Considerations

  • For Approach 1, when adding a new product, set its sortOrder to the highest existing sortOrder in the restaurant plus 1—this ensures it defaults to the end of the list.
  • For Approach 2, when adding a new product to a restaurant, push its ID to the end of the productOrder array to maintain default positioning.
  • Both approaches are solid—pick the one that aligns best with your data model and workflow!

内容的提问来源于stack exchange,提问作者Kannan T

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:52:42