、MongoDBの更新親&ノードMongoDBのネイティブ・ドライブを搭載した親の親&Iは、以下の仮説モデルを持っているので、あちこち
A01は、直接の子(A03)、孫(A04)と偉大な孫を(持っていますA05): - > A03 - > A04 - A01> A05
A02は、直接の子(A06)
子供がスコアを取得した場合、すべての親は、それが取得されています。私はA05にスコアを与える。例えば、もし、すべての親(A04へA01)は、アプリケーションが(1 A05のスコアを高めるために)クエリを送信する、私の素朴な機能でスコア
[{
_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サーバーに送信します。 mongoサーバーはクエリを受信して実行し、アプリケーションにいくつかのデータを返します。アプリケーションは親の_idがあるかどうかをチェックし、親の_idがある場合は、クエリをmongoサーバに送信します。 parent _idがなくなるまでプロセスが繰り返されます。
私は、mongoサーバーがリモートでホストされている場合、(1)データが巨大であれば帯域幅を消費するため、アプリケーションとmongoサーバーの間でデータを前後に送信するのが最良の選択肢ではないと考えています。
私はbulkWriteを見て、それがP_ID
を知らないときに更新することはできません私はとStore a JavaScript Function on the Server「の接続は、低レイテンシで高速です」しかし、それはアプリケーションロジックを保管しないでください「と言う指示するrunning js file in mongo shellを見てデータベースに格納されます。 「高速」ではない可能性があります。
したがって、質問:この状況で「最良の」方法は、すべての親のスコアを更新することです。