MongoDB产品和包的数据库设计

时间:2017-01-17 14:03:36

标签: node.js mongodb mongoose

我正在尝试使用mongoDB数据库构建一个基于Node.js的电子商务网站,我遇到了一些数据库设计或我缺少的逻辑问题

总而言之,我Product包含价格,名称,描述等......以及包含一系列产品的Bundle(通过引用)。我必须订购时遇到的主要问题是,我无法将ProductBundle放在一起......

所以我已经有了Product架构:

const productSchema = new mongoose.Schema({
  file: {
    type: String,
    required: true,
  },
  name: {
    type: String,
    required: true,
  },
  description: {
    type: String,
    required: true,
  },
  preparation: String,
  allergics: {
    type: Array,
    required: true,
  },
  price: {
    type: Number,
    required: true,
  },
  // More fields
});

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

包含引用Bundle的{​​{1}}架构(一个包含多个产品):

Product

因此,当用户订购捆绑包或单个产品时,我使用此架构:

const bundleSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
  },
  price: {
    type: Number,
    required: true,
  },
  itemsId: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Product',
    required: true,
  }],
  description: String,
  reduction: {
    type: Number,
    min: 0,
    default: 0,
    max: 100,
  },
});

module.exports = mongoose.model('Bundle', bundleSchema);

正如您所看到的,我只提及const orderSchema = new mongoose.Schema({ orderedBy: { type: mongoose.Schema.Types.ObjectId, ref: 'User', }, articlesId: [ { type: mongoose.Schema.Types.ObjectId, ref: 'Product', }, ], itemsNumber: { type: Array, required: true, }, amount: Number, orderedAt: Date, placeToShip: { type: mongoose.Schema.Types.ObjectId, ref: 'Place', }, }); module.exports = mongoose.model('Order', orderSchema); ,但我想引用ProductProduct,我不知道这是否可行,或者这是像这样设计数据库的错误方法。

很抱歉,如果帖子有点长,但我想尽可能清楚!非常感谢。

1 个答案:

答案 0 :(得分:1)

如果您想在product中引用bundlearticleId(取决于用户购买捆绑产品或单个产品),您可以这样做:

不要在ref的{​​{1}}字段中提供articleId,只需将其orderSchema指定为type

ObjectId

并且,在填充时告诉它const orderSchema = new mongoose.Schema({ ... articlesId: [ { type: mongoose.Schema.Types.ObjectId }, ], ... }); model

populate

但是,你必须找到//In case user bought a product Order.find({findQuery}) .populate({path : '',model : 'Product'}) .exec(function(err,result){...}); //In case user bought a Bundle Order.find({findQuery}) .populate({path : '',model : 'Bundle'}) .exec(function(err,result){...}); 买一个userproduct的方法。 希望对你有帮助!