После небольшого исследования я нашел это решение, однако я не знаю, надежно ли оно на 100%, но я полагаю, что этот метод заблокирует документ и не позволит другим потокам читать документ между операциями запроса и обновления.
var query = {
_id: productId,
closed: false,
currentPrice: {
$lt: price
}
},
update = {
$push: {
bids: bid
},
currentPrice: price,
currentUser: user,
currentBid: bid
},
options = {
new: true
};
return Product.findOneAndUpdate(query, update, options)
.then(product => {
if (!product) throw Error(`no product found with id ${productId}`)
return bid._id.toString()
})