使用Mongoose同步更新文档

时间:2018-11-15 07:53:31

标签: node.js mongodb mongoose concurrency

我在Kubernetes集群中部署了一个nodejs API服务器。 用户可以发送拍卖项目的出价。 为了防止出价超越另一个出价,需要进行一些同步。

我看到以下出价信息:

  • 开始一项交易,读取当前出价并将其与收到的出价进行比较并更新记录
  • 创建与上述功能相同的聚合

我不知道走哪条路。我也了解您需要使用IX或X锁定文档。

对于RDBMS,您将创建一个事务来锁定记录并在更新后将其释放,但是我不知道该记录对MongoDB的工作方式。

Product.findById(productId)
  .then(productmatch => {
    if (productmatch.currentPrice > price) throw Error('no go')

    const bid = new Bid({
      price,
      date: Date.now(),
      user: user._id
    })
    return Product.findByIdAndUpdate(productId, {
        $push: {
          bids: bid
        },
        currentPrice: price,
        currentUser: user,
        currentBid: bid
      }, {
        new: true
      })
      .then(product => {
        if (!product) throw Error(`no go`)

        return bid._id.toString()
      })
  })

1 个答案:

答案 0 :(得分:0)

经过更多研究,我想出了这个解决方案,但是我不知道它是否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()
  })