我已阅读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是一个更好的选择吗?
答案 0 :(得分:1)
在软件维护方面,选项1-是首选方法。将Javascript放在服务器中并执行它将提供更好的性能,并且如果整个过程在生产环境中开发一次使用,则可以使用它。如果是长时间的解决方案,肯定选项1是首选方案。