我正在开发一个任务查询。当请求任务时,我将使用以下代码返回最旧的任务:
Task.find({})
// Filter for those that are not started yet
.where('startDate').equals(null)
// Sort ascending to get the oldest
.sort({ reqDate: 'asc' }).findOne(function (err, task) { ... }
在最后一个括号内,我将 startDate 设置为当前时间。 这些请求是通过调用运行express的单个NodeJS(Express)API并使用Mongoose与MongoDB进行通信来完成的。
这适用于只有一个人请求任务,但我现在想的是一个巨大的规模。如果有多个人在同一时刻请求,他们在几毫秒的相同时间内接收到相同的任务怎么办?
有没有办法确保文件的startDate
在被mongoose找到的那一刻设置?
答案 0 :(得分:2)
在Mongo那里db.collection.findAndModify()
和db.collection.findOneAndUpdate()
:
但无论如何你很可能会遇到竞争条件。使用Redis,RabbitMQ,ZeroMQ,ActiveMQ,NSQ等实现队列可能会更好。
请参阅:
这里有更多工具:
总结一下,您可以使用db.collection.findAndModify()
和db.collection.findOneAndUpdate()
解决当前问题,但使用适当的队列或发布/订阅工具可以省去很多麻烦,尤其是当你开始同时处理多个任务时。