在哪里存储用户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 似乎提倡类似的方法(参见一对多部分)。可能值得一试。
我说的是:
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 似乎提倡类似的方法(参见一对多部分)。可能值得一试。