Mongodb更新父母&父母的父母&来回

时间:2016-07-10 05:31:09

标签: mongodb database-schema node-mongodb-native

我在下面有一个假设模型,其中包含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但它说"不要将应用程序逻辑存储在数据库中。"并且可能不是"快速"。

所以问题是:什么是最好的"在这种情况下,更新所有父母的分数。

1 个答案:

答案 0 :(得分:1)

我会考虑......

  • 使用图形数据库代替本机允许这些类型的更新。
  • 添加其他字段,例如" family_id"这样您就可以进行一次多次更新:db.collection.update({"family_id": "123"}, { $inc: { score } })
  • 与上述类似,存储每个孩子的父母列表。这可以让您进行两次更新(查找和更新子项;更新所有父项)。

在任何情况下,您也可以考虑更新父母'得分,但在你需要计算得分时总结他们的孩子。通过一些架构更改,您可以使用聚合管道。如果经常增量并且很少查询,这将更有效。