我所说的是:
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 []添加了一个项目,整个数组将被发送回客户端。
那你觉得怎么样?将这些数据保存在用户文档中是否会变得更好?可能是解决这些问题的“流星方式”。
答案 0 :(得分:1)
您似乎意识到每个选项的优缺点。不幸的是,你的问题主要是基于意见的。
通常情况下,如果您的关注者阵列规模较小而且不经常更改,请将其嵌入。
否则专用收藏是可行的方法。
对于这种情况,您可能需要查看https://atmospherejs.com/cottz/publish,它看起来非常有效,并且很容易在语法上实现。
答案 1 :(得分:1)
我认为将它嵌套在用户文档中是个更好的主意。将其存储在单独的集合中会导致大量不必要的重复,每次运行发布功能时,您都必须再次扫描整个集合。如果你担心阵列变得太大,在大多数情况下,不要(通常,全文小说只需要几百kb)。另外,如果您已经发布了用户文档,则不必将任何新文档存入内存;你已经拥有了所需的一切。
这MongoDB blog post似乎提倡类似的方法(参见一对多部分)。可能值得一试。