在哪里存储用户关注/关注者?用户的Followings收集文件?胖文件VS.多态文件

时间:2015-01-21 09:55:31

标签: mongodb meteor

我所说的是:

Meteor.users.findOne() =
{
  _id: "..."
  ...
  followers: {
    users: Array[], // ["someUserId1", "someUserId2"]
    pages: Array[]  // ["somePageId1", "somePageId2"]
  }
}

VS

Followings.findOne() =
{
  _id: "..."
  followeeId: "..."
  followeeType: "user"
  followerId: "..."
}

我发现第二个效率非常低,因为我需要使用smartPublish来发布用户的关注者。

Meteor.smartPublish('userFollowers', function(userId) {
  var coursors = [],
      followings = Followings.find({followeeId: userId});
  followings.forEach(function(following) {
    coursors.push(Meteor.users.find({_id: following.followerId}));
  });
  return coursors;
});

我无法过滤铁路由器内的用户。我缓存订阅,因此可能会有更多用户。

我想做这样的事情:

data: function() {
  return {
    users: Meteor.users.find({_id: {$in: Meteor.user().followers.users}})
  };
},

在Document中使用嵌套数组的一个坏处是,如果我向followers.users []添加了一个项目,整个数组将被发送回客户端。

那你觉得怎么样?将这些数据保存在用户文档中是否会变得更好?可能是解决这些问题的“流星方式”。

2 个答案:

答案 0 :(得分:1)

您似乎意识到每个选项的优缺点。不幸的是,你的问题主要是基于意见的。

通常情况下,如果您的关注者阵列规模较小而且不经常更改,请将其嵌入。

否则专用收藏是可行的方法。

对于这种情况,您可能需要查看https://atmospherejs.com/cottz/publish,它看起来非常有效,并且很容易在语法上实现。

答案 1 :(得分:1)

我认为将它嵌套在用户文档中是个更好的主意。将其存储在单独的集合中会导致大量不必要的重复,每次运行发布功能时,您都必须再次扫描整个集合。如果你担心阵列变得太大,在大多数情况下,不要(通常,全文小说只需要几百kb)。另外,如果您已经发布了用户文档,则不必将任何新文档存入内存;你已经拥有了所需的一切。

MongoDB blog post似乎提倡类似的方法(参见一对多部分)。可能值得一试。