将用户发布到其他集合时出现问题

时间:2015-10-29 10:11:26

标签: javascript mongodb meteor collections

我将朋友的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集合中使用它们。

2 个答案:

答案 0 :(得分:2)

我最近回答了一个类似的问题here

  

出版物将文档发布到您的馆藏。发布可以命名为random,但如果它从名为NotRandom的集合中返回一个游标,那么它们就会在客户端上发布到该集合。

要解决您的问题,您可以使用publish函数中提供的方法addedchangedremoved。 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 );