我在下面有一个假设模型,其中包含node-mongodb-native-drive
A01有一个直接的孩子(A03),一个孙子(A04)和一个曾孙子(A05):A01 - > A03 - > A04 - > A05
A02有一个直接的孩子(A06)
如果孩子得分,所有父母都会得到分数。例如,如果我给A05分数,所有父母(A01到A04)都会得分
[{
_id: 'A01',
p_id: '', // parent _id
score: 0,
}, {
_id: 'A02',
p_id: '',
score: 0,
}, {
_id: 'A03',
p_id: 'A01',
score: 0,
}, {
_id: 'A04',
p_id: 'A03',
score: 0,
}, {
_id: 'A05',
p_id: 'A04',
score: 0,
}, {
_id: 'A06',
p_id: '',
score: 0,
},
{
_id: 'A07',
p_id: 'A02',
score: 0,
}, {
_id: 'A08',
p_id: '',
score: 0,
}]
// my naive implementation
function updateScore({ _id, score }) {
return db.collection
.findOneAndUpdate({ _id: }, { $inc: { score } })
.then(function ({ value }) {
if (value && value.p_id) return updateScore({ _id: value.p_id, score }) // recursively update the parent score
return Promise.resolve() // if no parent is found
})
.catch(function (error) {})
}
updateScore({ _id: 'A05', score: 1 })
在我的天真功能中,应用程序向mongo服务器发送查询(将A05的分数增加1)。 mongo服务器接收查询并运行它,将一些数据返回给应用程序。应用程序检查是否存在父_id,如果是,则将查询发送到mongo服务器。重复该过程,直到没有父_id。
我的想法是,在应用程序和mongo服务器之间来回传送数据不是最好的选择,因为(1)如果远程托管mongo服务器的延迟,(2)如果数据很大则消耗带宽。 / p>
我看了bulkWrite,但是当它不知道p_id时无法更新
我看了running js file in mongo shell,表示"连接速度快,延迟低"和Store a JavaScript Function on the Server但它说"不要将应用程序逻辑存储在数据库中。"并且可能不是"快速"。
所以问题是:什么是最好的"在这种情况下,更新所有父母的分数。
答案 0 :(得分:1)
我会考虑......
db.collection.update({"family_id": "123"}, { $inc: { score } })
。在任何情况下,您也可以考虑不更新父母'得分,但在你需要计算得分时总结他们的孩子。通过一些架构更改,您可以使用聚合管道。如果经常增量并且很少查询,这将更有效。