我将朋友的userID存储在我的'profile.friends'中作为每个用户文档中的数组:
...
"profile" : {
"friends" : [
"LminJPr2mC2YBB9YX"
]
}
...
我有一个朋友收藏,我想收集朋友的所有用户数据。
我发布的内容如下:
Meteor.publish('friends', function () {
let friendslist = Meteor.users.findOne({_id: this.userId}).profile.friends;
console.log(friendslist);
return Meteor.users.find({_id: {$in: friendslist}});
});
我的问题是,在客户端上,Friends集合始终为空。不是将它们发布到Friends集合中,而是可以在Meteor.users集合中使用Friends,但我只需要在Friends集合中使用它们。
答案 0 :(得分:2)
我最近回答了一个类似的问题here:
出版物将文档发布到您的馆藏。发布可以命名为
random
,但如果它从名为NotRandom
的集合中返回一个游标,那么它们就会在客户端上发布到该集合。
要解决您的问题,您可以使用publish
函数中提供的方法added
,changed
,removed
。 E.g:
Meteor.publish('friends', function () {
let collectionName = 'friends';
let friendslist = Meteor.users.findOne({_id: this.userId}).profile.friends;
Meteor.users.find({_id: {$in: friendslist}}).forEach((friend) => {
this.added(collectionName, friend._id, friend);
});
});
这只会将所有用户发布到集合friends
。如果您想让它变得反应,请查看我上面链接的文档中的示例。您必须在光标上使用observeChanges()
。
答案 1 :(得分:1)
我看到这个问题已经成功解答,所以我不会解决您提出的确切问题。但是,有两点值得。
(1)我建议将朋友信息存储在单独的集合中。这将使您的代码更简单并提高其性能。例如,当用户添加(或删除)朋友时,您所要做的就是在集合中插入(或删除)文档,而不是在用户文档中读取,修改和更新数组。此集合中的文档可能类似于:
{
_id: <auto generated Mongo id>
fromUserId: <id of user doing the friending>,
toUserId: <id of user being friended>
}
(2)请注意,您可能不希望发布用户记录的所有详细信息。例如,如果您只想发布用户名和配置文件,则可以执行以下操作:
var query = {_id: { $in: friendslist } };
var options = { fields: { username: 1, profile: 1 } };
return Meteor.users.find( query, options );