2016-02-20 47 views
1

我正在设计一个人们可以预订活动的网站。我设计的模式存在一些并发问题。首先,我要表明的模式:Mongo数据库设计

{ 
    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. 
    ] } 
} 

现在事件的价格是唯一由DatePackage。因此,如果包装不同,同一日期可以有多个价格。

只有Date才可用。所以我必须为此创建一个单独的对象。

问题

的问题是,我有两个不同的调用。

  1. 保存可用性(节省了一次所有日期的能力。这是一个全部删除和插入新呼叫类型,但保持booked相同的值)
  2. 预订(增加booked由1一个特定的日期)

由于两个驻留在同一个对象,我想我会在未来的一个大的并发问题,因为,如果我救的可用性,并在同一时间使用者的书籍,同样的事件,在booked号可能不正确。

有没有更好的解决方案?

回答

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}} 
    ) 
} 

更新使用批量操作

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(); 
+0

是预订

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}} ) } 

编辑例如,你的假设有关我的帖子更新是正确的。 我也想到了这个,但是你不觉得这也是个坏主意吗? 如果我有100个元素在数组中,它会打100个电话到数据库? –

+0

正如我现在写的是。但研究bulk.find.update。我已经对具有数千条记录的类似场景使用批量操作,并且表现非常出色。 – ThrowsException

+0

谢谢,看看猫鼬上如何做到这一点! :) –