0

我有一个简单的选择和更新逻辑的问题:

task = Task.queueing.where(conditions).order(:created_at.asc).first
if task
  task.set(:status=>2)
end

很简单吧?

但是,问题是:同时有 100 多个请求。这么多客户得到了相同的记录,这就是我不想要的。

在 mysql 中,我可以做这样的事情来避免重复加载:

rnd_str = 10000000 * rand
Task.update(status:rnd_str).limit(1) # this may be wrong code
task = Task.where(status:rnd_str).first
task.set(status:2)
render :json=>task

但是如何在 mongomapper 中使用 QUERY 更新 1 条记录?

谢谢 !

4

1 回答 1

0

默认情况下,MongoDB 中的更新只会更新一条记录。您可以选择使用{multi:true}选项更新查询中的所有匹配文档,但默认情况下您的更新只会更新一个文档。

所以你要做的就是将你的“查询”组合到你的更新语句中,这样它们就可以原子地执行(就像你在 SQL 中做的那样),而不是做两个单独的操作。在 shell 语法中,类似于:

   db.queueing.update({conditions}, {$set:{status:2}})

现在,如果您还需要更新的任务文档来使用,那么您可以使用findAndModify在一个原子操作中更新和返回文档。像这样:

   task = db.queueing.findAndModify( {your-condition}, 
                                     sort: { your-ordering },
                                     update: { $set: { status: 2 } }
          } );
于 2013-06-04T15:05:32.983 回答