是否有必要双重链接MongoDB的数据,类似于MySQL,其中相关条目具有指向彼此的ID。换句话说,之间是否有任何性能差异:
db.events.find({userIds: myId}).fetch()
和
db.events.find({_id: {$in: [1, 2, 3, 4]} }).fetch()
答案 0 :(得分:0)
通常,$in
查询速度惊人,但是否正确的方法取决于数据的基数(每个用户的最大事件数,每个事件的最大用户数)和查询模式。
一般来说,索引的想法是避免必须来回链接。这使您提到的繁琐更新变得不必要。它也更容易查询,更易于维护,并且更容易分页。
最后一个参数特别重要,但取决于您的查询模式:假设您要显示用户参与的十个最新事件。然后,您可以创建一个索引{userIds : 1, eventDate: -1}
,它将完全匹配查询,而不必拉动或迭代所有用户前往的事件。
如果您想使用其他方法执行此查询,则还必须将eventDate
存储在用户中,这似乎相当尴尬。
另一方面,如果事件很大,您可能会遇到事件对象大小的问题(想想100万参与者)。您可能希望将参与者的名称非规范化以用于显示目的,这使得对象更大。
如果您选择使用$in
个查询,请记住
ObjectIds
并且用户每天都参加一个事件,您可能会遇到每个_id
桶你有,也有较旧的,这可能是昂贵的。)