我已经通过了MongoU课程和中途课程。 我已经阅读了我可以做的事情,并且做了可以学习的事情,但是没能学会如何处理我认为的标准情况。

考虑酒店房间的预订系统。 有一个集合预订:

4/1-1室4/1-2室4/1-3室

然后,当客户检查预订集合{日期:4/1房间:3}时,他们会找到预订,应用程序可以拒绝该预订。

但是,假设有两个用户同时寻找{date:4/1 Room:4},则该应用程序将继续为两个客户进行预订,这意味着他们将尝试创建预订。

接下来发生什么? 一位客户预订,另一位失败。 某种种族状况? 还是一个客户得到预订,而另一个人覆盖了它。

可以通过写保护来防止这种情况吗? 还是其他锁? 还是对于更多的原子数据库来说这是更好的情况?

我看到的所有演示都与博客有关,而博客对唯一数据的关注很少。

#1楼 票数:0 已采纳

通常,您需要谨慎使用数据模型,当然也要注意应用程序流程。

防止重复预订的一种方法是使用复合_id字段:

{
  _id: { room: 1, date:"4/1" }
}

因此,一旦将房间1预订为4/1,就无法再为房间1创建重复的预订,因为_id's保证是唯一的。 第二次insert将失败。 或者,您可以在任意复合字段上创建唯一索引。

请注意,如果没有适当的权限检查,您的应用程序不应在此文档上更新或更新,这不适用于仅MongoDB。 在最简单的情况下,要进行更新,您需要检查是否试图更新文档的用户实际上是预订房间的用户。 因此,我们的模型需要扩展:

{
  _id:{room:"1",date:"4/1"},
  reservationFor:"userID"
}

因此,现在变得非常容易:在插入保留之前,您先检查一个。 如果结果不为空,则已经有该房间的预订。 如果由于插入时ID重复而引发异常,则在此期间进行了保留。 在进行更新之前,您需要检查是否reservationFor了当前用户的用户ID。

如何应对这种情况在很大程度上取决于用于开发应用程序的语言和框架。 我倾向于做的是捕捉相应的异常并相应地修改errorMessage

  ask by csduarte translate from so

未解决问题?本站智能推荐:

4回复

NoSQL数据库:读取一致性怎么样?

从我可以看出,NoSQL数据库可能是高强度数据读取应用程序的一个很好的选择,但是如果你还需要做很多数据更新并且事务性对你来说非常重要(不管怎么样)符合ACID)。 对? 太简单了。 但无论如何,假设我部分正确,至少我现在担心NoSQL数据库如何维护您正在阅读或写入的数据的“读取一致”视图
1回复

CouchDB与MongoDB在CAP(一致性,可用性,分区)原则方面的比较

但是,我对长沙发DB和MongoDB的不同答案感到困惑(例如, http : //blog.scottlogic.com/2014/08/04/mongodb-vs-couchdb.html,此博客告诉我们,MongoDB是CP,CouchDB是AP)。这个答案何时在MongoDB上使用Couc
2回复

是否将所有内容都存储在MongoDB中?同时使用SQL?(最终一致性)

我和我的大学正在考虑使用MongoDB为我们的应用程序存储所有数据。 有人认为,由于Mongo最终在用户注册或更新其个人资料时(或类似但更重要的内容)的一致性,因此不会立即看到结果,并可能使用户感到沮丧。 我很确定,除非我们有大量数据并且进行一些复制,否则我们将看不到最终一致性的影响。
1回复

NONO的ACID的NO保证那么如何确保一致性?

例如,要在MongoDB中查找和保存文档: 默认情况下,_id是主键,因此article1和article2的文档相同。 是否有可能获得第2条的过时文档,而attrA尚未设置为A,因为从理论上讲MongoDB不遵循ACID属性。
2回复

最终的一致性和测试用例

在处理像MongoDB这样的最终一致的数据存储时编写测试用例的最佳实践是什么? 我目前的设置是Mongodb,它具有3节点主/从/从设置,slave-ok设置为true。 这意味着主节点用于只写,两个从节点用于只读。 数据在从站上保持一致所用的时间相对较短,并且取决于操作和数据大小。
3回复

在非分布式系统上使用NoSQL是否有意义?(试图了解最终的一致性)

最近两天,我一直在阅读和学习NoSQL和MongoDB,CouchDB等,但是我仍然无法确定这是否适合我。 让我担心的是最终的一致性。 这种一致性是否仅在使用集群时才发挥作用? (我将站点托管在单个专用服务器中,所以我不知道我是否可以从NoSQL中受益)对于哪种类型的应用程序来说,具有最
2回复

在Mongodb中读取您自己的写入一致性

首先,这是Pymongo文档中的内容 默认情况下,当线程首次在MongoDB上运行操作时,PyMongo会为每个线程启动一个请求。 这保证了**读写一致性 。 在请求中,线程将继续独占使用相同的套接字,并且没有其他线程将使用此套接字,直到线程调用end_request()或它终止。
1回复

MongoDB(PyMongo)分页不同,结果不一致

我正在尝试使用 pymongo 实现不同的分页。 我有记录 我只想要每条记录的名称,其中名称可以重复,所以我想要带有分页的不同名称。 问题是,对于这个查询,每次我查询时,我都会得到相同页码的不同结果看了这个答案 Distinct() 命令与 skip() 和 limit() 一起使用但在我的情况下没