在哪里存储用户followings/followers? Followers 集合的用户文档?胖文件VS。多态文档

Where to store users followings/followers? User's document of Followings collection? Fat document VS. polymorphic documents

我说的是:

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

对比

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;
});

而且我无法在 iron-router 中过滤用户。我缓存了订阅,所以可能会有比我需要的更多的用户。

我想做这样的事情:

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

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

那你怎么看?将此类数据保存在用户文档中是否更好,这样它就会变胖?可能是解决此类问题的'Meteor way'。

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

一般来说,如果您的跟随者数组较小且不经常更改,请将它们嵌入。

否则一个专门的集合是要走的路。

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

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

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