2016-07-10 5 views
0

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を見てデータベースに格納されます。 「高速」ではない可能性があります。

したがって、質問:この状況で「最良の」方法は、すべての親のスコアを更新することです。

答えて

1

私はネイティブにアップデートのこれらの種類を許可する代わりに、グラフデータベースを使用して...

  • を検討します。
  • "family_id"のような他のフィールドを追加することで、単一のマルチアップデートを行うことができます:db.collection.update({"family_id": "123"}, { $inc: { score } })。それぞれの子のための親のリストを格納上記と同様に
  • 、。これにより、2つの更新(子を見つけて更新する;すべての親を更新する)に進むことができます。いずれの場合においても

、あなたはまた、両親のスコアを更新ないを検討することもできますが、あなたはスコアを計算する必要がある場合に代わりに子どもを合計します。スキーマの変更によっては、集約パイプラインを使用することができます。これは、頻繁に増分してめったにクエリを実行しないと、より効率的になります。

関連する問題