我说的是:
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;
});我不能在铁路由器里过滤用户。我缓存订阅,这样可能会有比我需要的更多的用户。
我想做这样的事:
data: function() {
return {
users: Meteor.users.find({_id: {$in: Meteor.user().followers.users}})
};
},在文档中使用嵌套数组的一个坏处是,如果我向followers.users[]添加了一个项,整个数组将被发送回客户端。
你怎么看?把这样的数据保存在用户文档中,这样它就会变胖,这更好吗?也许这是解决这些问题的一种“流星方式”。
发布于 2015-01-21 21:08:59
我认为最好将其嵌套在用户文档中。将其存储在单独的集合中会导致大量不必要的重复,每次运行发布函数时,您都必须再次扫描整个集合。如果您担心数组太大,在大多数情况下,不要(通常,一本全文小说只需要几百kb)。另外,如果您已经发布了用户文档,则不必将任何新文档拖到内存中;您已经拥有了所需的一切。
这个MongoDB博客文章似乎提倡类似的方法(请参阅一对多的部分)。也许值得一看。
发布于 2015-01-21 15:50:30
你似乎知道每一种选择的利弊。不幸的是,你的问题大多是基于意见的。
通常,如果跟随者数组的大小很小,并且不会经常更改,请将它们嵌入其中。
否则,一个专门的集合是要走的路。
对于这种情况,您可能需要看一看https://atmospherejs.com/cottz/publish,它在所做的事情上似乎非常有效,并且在语法上非常容易实现。
https://stackoverflow.com/questions/28064168
复制相似问题