双重链接MongoDB所需的数据?

时间:2013-08-23 02:48:52

标签: mongodb

是否有必要双重链接MongoDB的数据,类似于MySQL,其中相关条目具有指向彼此的ID。换句话说,之间是否有任何性能差异:

db.events.find({userIds: myId}).fetch()

db.events.find({_id: {$in: [1, 2, 3, 4]} }).fetch()

1 个答案:

答案 0 :(得分:0)

通常,$in查询速度惊人,但是否正确的方法取决于数据的基数(每个用户的最大事件数,每个事件的最大用户数)和查询模式。

一般来说,索引的想法是避免必须来回链接。这使您提到的繁琐更新变得不必要。它也更容易查询,更易于维护,并且更容易分页。

最后一个参数特别重要,但取决于您的查询模式:假设您要显示用户参与的十个最新事件。然后,您可以创建一个索引{userIds : 1, eventDate: -1},它将完全匹配查询,而不必拉动或迭代所有用户前往的事件。

如果您想使用其他方法执行此查询,则还必须将eventDate存储在用户中,这似乎相当尴尬。

另一方面,如果事件很大,您可能会遇到事件对象大小的问题(想想100万参与者)。您可能希望将参与者的名称非规范化以用于显示目的,这使得对象更大。

如果您选择使用$in个查询,请记住

  1. 随着阵列变大,性能下降。我不确定是什么导致这种情况,但是当数组超过一两千个(!)元素时我遇到了麻烦。
  2. 如果ids传播得很远,MongoDB可能不得不打很多桶。这在很大程度上取决于您使用的键的类型,但它可能很痛苦(例如,如果您使用ObjectIds并且用户每天都参加一个事件,您可能会遇到每个_id桶你有,也有较旧的,这可能是昂贵的。)