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

如何在Mongoose的一个Schema中引用另一个Schema作为其属性

Mongoose Order关联Product方案

你可以根据业务需求选择以下两种实现方式:

方案1:ObjectId引用关联(推荐)

该方案仅在Order中存储Product的_id,查询时自动关联拉取商品信息,商品信息更新时所有关联订单的商品信息会同步更新,适合不需要保留下单时商品快照的场景。

调整后的Order.js代码:

const mongoose = require('mongoose');

const orderSchema = new mongoose.Schema(
    {
        date: {
             type:Date, 
             default: Date.now},
        customerName: String,
        customerAddress: String,
        creditCard: Number, // 注意:生产环境禁止存储明文信用卡号,需做加密处理
        // 关联Product模型
        products: [{
            type: mongoose.Schema.Types.ObjectId,
            ref: 'Product' // 这里的值要和Product模型mongoose.model的第一个参数完全一致
        }]
    },
     { timestamps: true }
);

const Order = mongoose.model('Order', orderSchema);
module.exports = Order;

用法示例:

  • 创建订单:直接传入对应商品的_id数组即可
    const newOrder = await Order.create({
      customerName: '张三',
      customerAddress: 'XX街道XX号',
      creditCard: 1234567890123456,
      products: ['650xxxxxxxxx', '651xxxxxxxxx'] // 替换为真实的Product文档_id
    })
    
  • 查询订单时填充商品信息:
    const orders = await Order.find().populate('products').exec()
    

如果需要记录每个商品的购买数量,可以调整products字段定义为:

products: [{
    product: { type: mongoose.Schema.Types.ObjectId, ref: 'Product' },
    quantity: { type: Number, default: 1 }
}]

查询时改为populate('products.product')即可。

方案2:嵌入商品文档

该方案会将下单时的完整商品信息直接存入Order文档,后续商品信息修改不会影响历史订单,适合需要保留下单快照的电商场景。

先调整product.js,导出productSchema:

const mongoose = require('mongoose');

const productSchema = new mongoose.Schema(
    {
        name: String,
        price: Number,
        category: String
    },
    { timestamps: true }
);

const Product = mongoose.model('Product', productSchema);
// 同时导出schema供Order引入
module.exports = { Product, productSchema };

调整后的Order.js代码:

const mongoose = require('mongoose');
const { productSchema } = require('./product.js'); // 按你的实际文件路径调整

const orderSchema = new mongoose.Schema(
    {
        date: {
             type:Date, 
             default: Date.now},
        customerName: String,
        customerAddress: String,
        creditCard: Number,
        // 直接嵌入productSchema
        products: [productSchema]
    },
     { timestamps: true }
);

const Order = mongoose.model('Order', orderSchema);
module.exports = Order;

用法示例:

创建订单时直接传入商品完整对象数组即可,查询时无需populate直接返回商品信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:15:03