Mongoose更新文档在找到它的那一刻

时间:2017-03-21 14:30:56

标签: node.js mongodb mongoose

我正在开发一个任务查询。当请求任务时,我将使用以下代码返回最旧的任务:

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找到的那一刻设置?

1 个答案:

答案 0 :(得分:2)

在Mongo那里db.collection.findAndModify()db.collection.findOneAndUpdate()

但无论如何你很可能会遇到竞争条件。使用Redis,RabbitMQ,ZeroMQ,ActiveMQ,NSQ等实现队列可能会更好。

请参阅:

这里有更多工具:

总结一下,您可以使用db.collection.findAndModify()db.collection.findOneAndUpdate()解决当前问题,但使用适当的队列或发布/订阅工具可以省去很多麻烦,尤其是当你开始同时处理多个任务时。