我正在使用mongodb来存储数据的电子商务网站。其中一个模块将是价格/购物车规则,用户将获得一张优惠券,他们可以在结账时放置以获得折扣。
这样做很好并且是标准的,我不确定的是如何最好地跟踪用户使用该优惠券的次数以及用于存储该优惠券的集合?
这是我到目前为止的模型:
schema = new mongoose.Schema
name:
type: String
required: true
description: i18nString.schema
coupon:
type: String
index: true
type:
type: String
enum: ["cart", "price"]
required: true
quantity:
type: Number
default: 1
user_qty:
type: Number
default: 1
from:
type: Date
required: true
to:
type: Date
required: true
discount:
type: Number
default: 0
required: true
log: [
user:
type: ObjectId
ref: "User"
updatedAt: Date
status: String
]
status:
type: String
enum: ["draft", "active", "archived"]
default: "draft"
required: true
这给了我一个类似的文件:
> db.rules.find({}).pretty();
{
"__v" : 3,
"_id" : ObjectId("561e53dfa7e6f5f91c63e32d"),
"coupon" : "Y3E3TL-3FE00W-DDR7PP-RR27Y8",
"description" : {
"en-UK" : "English description"
},
"discount" : 10,
"quantity": 500,
"user_qty": 5,
"from" : ISODate("2015-10-13T23:00:00Z"),
"log" : [
{
"user" : ObjectId("55848edda14c975ac907ad6d"),
"updatedAt" : ISODate("2015-10-14T13:08:47.956Z"),
"_id" : ObjectId("561e53dfa7e6f5f91c63e32e")
},
{
"user" : ObjectId("55848edda14c975ac907ad6d"),
"updatedAt" : ISODate("2015-10-14T13:09:11.592Z"),
"_id" : ObjectId("561e53f7a7e6f5f91c63e32f")
},
{
"user" : ObjectId("55848edda14c975ac907ad6d"),
"updatedAt" : ISODate("2015-10-14T14:46:03.289Z"),
"_id" : ObjectId("561e6aab4adfac513594bbe6")
},
{
"user" : ObjectId("55848edda14c975ac907ad6d"),
"updatedAt" : ISODate("2015-10-15T09:44:55.827Z"),
"_id" : ObjectId("561f7597efe4eb424baac50f")
}
],
"name" : "Coupon name",
"status" : "draft",
"to" : ISODate("2015-10-23T23:00:00Z"),
"type" : "cart"
}
我有一个用户集合,所以我应该将它存储在用户文档中,还是更好地拥有优惠券日志集合并计算用户使用特定优惠券的次数并将其与规则中的user_qty进行比较集合?
任何建议都非常感谢。
答案 0 :(得分:0)
我认为最好的方法是在每个用户记录上嵌入一个数组,并在其中存储所有具有独特属性的优惠券。这是因为即使您要创建一个不同的集合来存储优惠券,您仍然需要在您的用户记录中存储对这些优惠券的引用,因此仍然会创建一个额外的字段。
但是,如果优惠券是共享的,并且可以由多个用户同时使用,您可能需要创建一个不同的集合以避免重复数据。
这一切都始于用户交互模式 - 考虑到您的结构,我认为优惠券操作可能属于下列情况之一:
因此,如果优惠券绑定到用户,我建议您嵌入一个类似于以下模式的数组:
coupons: [
{
coupon: "Y3E3TL-3FE00W-DDR7PP-RR27Y8",
hits: 10,
...
//additional fields
},
{
coupon: "G547XW-F9JW04-RXFP77-7JJ0CE",
hits: 9,
...
//additional fields
}
]
否则,如果优惠券被分享,我认为您可以将所有优惠券存储在他们自己的收藏中并在您的用户记录中引用它们。因此,您的用户记录中可能只有优惠券和点击字段,而所有其他数据都存储在优惠券集合中:
coupons: [
{
couponRef: ObjectId("561e53dfa7e6f5f91c63e32d"),
hits: 10
},
{
couponRef: ObjectId("427e53dfa7e6f5f91c63e32d"),
hits: 9
}
]