我正在尝试使用mongoDB数据库构建一个基于Node.js的电子商务网站,我遇到了一些数据库设计或我缺少的逻辑问题
总而言之,我Product
包含价格,名称,描述等......以及包含一系列产品的Bundle
(通过引用)。我必须订购时遇到的主要问题是,我无法将Product
和Bundle
放在一起......
所以我已经有了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);
,但我想引用Product
和Product
,我不知道这是否可行,或者这是像这样设计数据库的错误方法。
很抱歉,如果帖子有点长,但我想尽可能清楚!非常感谢。
答案 0 :(得分:1)
如果您想在product
中引用bundle
或articleId
(取决于用户购买捆绑产品或单个产品),您可以这样做:
不要在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){...});
买一个user
或product
的方法。
希望对你有帮助!