Meteor,哪个mongo查询性能更高?

时间:2015-07-23 19:02:51

标签: mongodb meteor

我正在构建一个用户拥有活动Feed的社交应用。如果用户属于同一组,则Feed中的项目将相同。

所以...应用程序有许多用户可以选择的组。如果发生事件,将为该组中的每个用户创建活动源项。

但是我现在想到了一个包含userIds数组的单个文档的想法,没有可以针对活动供稿项采取的操作,所以我们没有什么可担心的。

我的问题实际上是两种方法中哪一种最好还是有更好的选择?预计一个小组可以容纳超过1万的用户。

4 个答案:

答案 0 :(得分:2)

检查我的理解:

  • 1个用户有很多组,1个组有很多用户(M:N)。
  • 1位用户有1个活动Feed(1:1)
  • 1个活动Feed有很多活动(1:M)
  • 1个事件有很多用户(1:M)

所以,你的收藏品是:

  • 用户
  • 活动

每个事件的FK均为groupId。每个用户都有一个groupId s。

数组

您创建用户活动供稿的查询将是:

Events.find({groupId: {$in: user.groups}});

groupId上的索引,当需要缩放时,您可以保存默认活动Feed&将其发送给没有组(或具有默认组)的每个人。 IIRC这就是reddit所做的。

尽量避免在1:M关系中使用数组。

答案 1 :(得分:0)

您没有提及的一个选项是创建类似Memberships集合的内容,其中文档的格式为{userId, groupId},并在两个字段上创建唯一的复合索引,如< / p>

Memberships._ensureIndex({groupId: 1, userId: 1}, {sparse: true, unique: true})

以这种方式创建索引可能是有意义的,因为您将查找特定组中的用户,并将帖子加入该组ID。如果您要按用户查找群组,则可以先将userId编入索引。

如果您要为每个用户同时显示多个组的联合活动,则可能会遇到Same-Origin Policy问题,在这种情况下,更新可能会更简单如果组发生更改,则直到用户刷新页面为止。

答案 2 :(得分:0)

我建议您创建自己的publish方法,以便只订阅相关数据,不要将过多数据部署到本地mongo。您可以在此处找到Flow-Router和基于路由的订阅的示例:

http://meteorpad.com/pad/Ba5DTe94NjFi3ZTPA/Playground_Flow-Router_Chat

答案 3 :(得分:0)

我想说最有效的选项是每个活动供稿都要嵌入每个用户文档中:

{
  "firstname" : "Joe",
  "lastname" : "Bloggs",
  "activities": [{
    "title": "Someone did something"
  }, {
    "title": "Someone did something else"
  }]
}

以Facebook为例,我认为活动源上的项目很少会改变。但他们会读得很多。每次加载活动源时,执行昂贵的连接查询(在非关系型NoSQL产品上)都会降低性能。

您最好将其嵌入User本身,就像手中拥有当前用户一样,您也可以随身携带活动源。

当活动被提升时&amp;需要添加到10K用户,那肯定会花更长的时间。但这可能发生在后台和只要需要就行。用户一旦发现朋友活动,就不会发生这种情况。

这种方法也存在缺点。例如,您需要将这些活动数据减少,或者您可能会为单个用户获取大量数据。然后丢掉一大堆。