【问题标题】:Where to store users followings/followers? User's document of Followings collection? Fat document VS. polymorphic documents在哪里存储用户关注/关注者?用户收藏的Follows文件?胖文件VS。多态文件
【发布时间】:2015-01-22 05:08:59
【问题描述】:

我说的是:

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

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

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

【问题讨论】:

    标签: mongodb meteor


    【解决方案1】:

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

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

    【讨论】:

    • 这是我学习 MongoDB 的第一个小时,我无法解释您的帖子如何让我有了深刻的理解。来自我的 MySQL,谢谢,我可以以全新的方式重新设计我的数据库并删除所有这些额外的表。
    • 没问题。听到这总是令人鼓舞的,谢谢!
    【解决方案2】:

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

    通常,如果您的追随者数组尺寸较小且不经常更改,请将它们嵌入。

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

    对于这种情况,您可能想看看https://atmospherejs.com/cottz/publish,它的作用似乎非常有效,并且在语法上很容易实现。

    【讨论】:

      猜你喜欢
      • 2013-03-14
      • 1970-01-01
      • 2013-11-08
      • 1970-01-01
      • 2020-06-04
      • 2023-04-02
      • 1970-01-01
      • 2020-04-01
      • 2012-09-27
      相关资源
      最近更新 更多