优化mongodb两阶段提交查询

时间:2016-07-10 04:45:58

标签: mongodb node-mongodb-native

我已阅读document,其中提出了进行多文档更新的两阶段提交模式。

我创建了一个如下例子(使用节点js本机驱动器)。

// produce collection

[{
  _id: 'p01',
  name: 'apple',
  qty: 10,
  transaction: [],
}, {
  _id: 'p02',
  name: 'banana'
  qty: 30,
  transaction: [],
}, {
  _id: 'p03',
  name: 'carrot',
  qty: 20,
  transaction: [],
}]

// transaction collection

[{
  _id: 't01',
  product: [{ _id: 'p01', qty: 2 }]
}]


// need to get more bananas for monkeys

db.collection('transactions')
  .insertOne({ // <- 1st query here
    _id: 't02',
    product: [{ _id: 'p02', qty: 5, status: 'initial' }]
  })
  .then(updateProduceQuantity({ _id: 'p02', qty: -5, transaction: 't02' })) // <- 2nd query here
  .then(completeTransaction({ _id: 't02' })) // <- 3rd query here
  .then(completeProduce({ _id: 'p02', transaction: 't02' })) // <- 4th query here
  .catch(function (e) {})


function updateProduceQuantity({ _id, qty, transaction }) {
  return function () {
    return db.collection('fruits')
      .updateOne({ _id }, { $inc: { qty }, { $push: transaction } })
  }
}

function completeTransaction({ _id }) {
  return function () {
    return db.collection('transactions')
      .updateOne({ _id }, { $set: { status: 'done' }})
  }
}

function completeProduce({ _id, transaction }) {
  return function () {
    return db.collection('fruits')
      .updateOne({ _id }, { $pull: transaction })
  }
} 

如果我理解正确,那么在应用程序级别,至少需要4个查询。 我的问题是:

1)这是否有效,因为数据必须在应用程序和服务器之间来回传递(特别是如果mongo服务器托管在具有高延迟的其他地方,或者在查询更复杂的情况下)?

2)如果效率低下,使用javascript in mongo shell是一个更好的选择吗?

1 个答案:

答案 0 :(得分:1)

在软件维护方面,选项1-是首选方法。将Javascript放在服务器中并执行它将提供更好的性能,并且如果整个过程在生产环境中开发一次使用,则可以使用它。如果是长时间的解决方案,肯定选项1是首选方案。