Javascript mongodb同步请求

Javascript mongodb同步请求,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我对node.js和mongodb完全陌生,我对同步同一时间段内发生的多个请求有一个问题。我已经读了一些关于这个话题的帖子,但是我还没有找到一个令人满意的答案 我有以下情况: 我的收藏中的文档具有状态属性。根据请求,我根据状态选择文档,然后更新状态 现在的问题是,如果同时有多个请求,所有请求都会选择同一个文档,因为第一次更新尚未写入数据库,但每个请求都应该有一个“自己的文档”来处理 使用node.js和mongodb满足这些需求是个好主意,还是应该坚持使用RDBMS的“经典”方法 我主要关注的是

我对node.js和mongodb完全陌生,我对同步同一时间段内发生的多个请求有一个问题。我已经读了一些关于这个话题的帖子,但是我还没有找到一个令人满意的答案

我有以下情况:

我的收藏中的文档具有状态属性。根据请求,我根据状态选择文档,然后更新状态

现在的问题是,如果同时有多个请求,所有请求都会选择同一个文档,因为第一次更新尚未写入数据库,但每个请求都应该有一个“自己的文档”来处理

使用node.js和mongodb满足这些需求是个好主意,还是应该坚持使用RDBMS的“经典”方法

我主要关注的是可伸缩性,这就是为什么我首先选择node.js和mongodb的原因

我非常感谢你给我的每一个建议,
致以最诚挚的问候

您可以完全在客户端(单例控制器等)或使用一些MongoDB功能对这种并发访问模式进行建模。要在数据库中建模它,可以考虑如下的文档结构(蒙哥shell中所做的示例):

当线程65需要使用浴室时,它发出一个查询并将返回的浴室标记为已占用:

> var thread65_wc = db.restrooms.findAndModify(
        { "query" : { "type" : "bathroom", "occupied" : false }, 
          "update" : { "$set" : { "occupied" : true } } })
find和modify
是原子的。当thread65开始查看文档时,它将检索文档并设置
已占用:true
,而不允许其他线程尝试使用相同的浴室或修改它(假设其他线程检查
已占用的
)。现在,thread 65可以使用浴室,一旦使用完毕,就可以腾出浴室,并可能改变其他属性:

> db.restrooms.update({ "_id" : thread65_wc._id }, 
                      { "$set" : { "occupied" : false, "dirty" : "very" } } )

使用
find和modify
occulated
标志,您可以确保每个线程都有一个文档要处理,并且在原始线程使用该文档的过程中,该文档不会被另一个线程触及。

确保数据库操作中的“顺序”并非易事。在这种情况下,您可以考虑使用单控制器和阻塞操作(例如,java中的同步命令)。因为Node.js是事件驱动的,所以更难控制事件的处理顺序。在Node.js中执行类似操作将违背其本质。好的,谢谢您的信息!我想是这样的。。。然后我将使用单例控制器
> db.restrooms.update({ "_id" : thread65_wc._id }, 
                      { "$set" : { "occupied" : false, "dirty" : "very" } } )