我正在设计一个人们可以预订活动的网站。我设计的模式有一些并发问题。让我先说明架构:
{
title: String,
pricing: { [
data: Date,
package: String,
price: Number
] },
availability: { [
date: Date,
capacity: Number, // Number of users a vendor can take.
booked: Number // Number of users booked the event for the date.
] }
}
现在,Date
和Package
的活动价格是唯一的。因此,如果包装不同,同一日期可以有多个价格。
仅Date
的可用性是唯一的。所以我必须为此创建一个单独的对象。
问题
问题是,我有两个不同的电话。
booked
的值相同)booked
增加1)由于两者都驻留在同一个对象中,我认为将来我会遇到很大的并发问题,因为如果我保存可用性并且同时用户预订相同的事件,booked
号码可能不正确
有更好的解决方案吗?
答案 0 :(得分:1)
我假设您的帖子更新客户端的容量类似于
{
id: ObjectId //Your event Id
updates [
{date: Date, capacity: newCapacity},
{date: Date, capacity: newCapacity}
]
}
您可以保持数组当前的状态,但您应该尝试仅定位容量属性而不是覆盖整个文档。下面的查询将遍历帖子并更新availablity
数组,目标只是数组中与查询匹配的第一项。我假设javascript作为后端,但想法是一样的。如果您有很多更新,我会考虑使用bulkUpdate
来提高性能
for(var i = 0; i < updates.length; i++) {
var update = updates[i];
db.collection.update(
{
_id: update.id,
"availability.date": update.date
},
{$set: {"availability.$.capacity": update.capacity}}
)
}
更新已预订的
for(var i = 0; i < updates.length; i++) {
var update = updates[i];
db.collection.update(
{
_id: update.id,
"availability.date": update.date
},
{"availability.$.booked": {$inc : 1}}
)
}
编辑使用批量操作的示例
var bulk = db.collection.initializeUnorderedBulkOp();
for(var i = 0; i < updates.length; i++) {
var update = updates[i];
bulk.find(
{
_id: update.id,
"availability.date": update.date
}).update({$set: {"availability.$.capacity": update.capacity}})
)
}
bulk.execute();