0

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

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

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

1 回答 1

0

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

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

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

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

另一方面,如果活动规模很大,您可能会遇到活动对象大小的问题(想想 100 万参与者)。您可能希望对参与者的名称进行非规范化以进行显示,这会使对象变得更大。

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

  1. 随着阵列变大,性能会下降。我不确定是什么原因造成的,但是当数组超过一两千(!)个元素时,我遇到了麻烦。
  2. 如果 id 分布很远,MongoDB 可能不得不打很多桶。这在很大程度上取决于您使用的密钥类型,但这可能会很痛苦(例如,如果您正在使用ObjectIds并且用户每天都参加一个活动,您可能会点击_id您拥有的每个存储桶,也包括旧存储桶,这可以贵)。
于 2013-08-23T10:31:24.303 回答