Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将用户发布到其他集合时出现问题_Javascript_Mongodb_Meteor_Collections - Fatal编程技术网

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

Javascript 将用户发布到其他集合时出现问题,javascript,mongodb,meteor,collections,Javascript,Mongodb,Meteor,Collections,我在我的“profile.friends”中将朋友的用户名存储为每个用户文档中的一个数组: ... "profile" : { "friends" : [ "LminJPr2mC2YBB9YX" ] } ... 我有一个朋友收集,我想有我的朋友的所有用户数据 我是这样发表的: Meteor.publish('friends', function () {

我在我的“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}});
});

我的问题是,在客户端上,朋友集合总是空的。Meteor.users集合中提供了朋友,但我只需要朋友集合中的朋友,而不是将它们发布到朋友集合中。

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

出版物将文档发布到您的收藏中。发布可以命名为
random
,但如果它从名为
NotRandom
的集合返回光标,则该集合就是它们在客户端上发布到的集合

要解决您的问题,您可以使用函数中提供的方法
添加的
更改的
删除的
。例如:

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);
    });
});

这将只是将所有用户发布到集合
朋友
。如果您想让它成为反应式的,请查看我上面链接的文档中的示例。您必须在光标上使用
observeChanges()

我看到这个问题已经得到了成功的回答,因此我将不讨论您提出的确切问题。然而,有两点值得一提

(1) 我建议将朋友信息存储在单独的集合中。这将使您的代码更简单,并提高其性能。例如,当用户添加(或删除)朋友时,您所要做的就是在集合中插入(或删除)文档,而不是读取、修改和更新用户文档中的数组。此集合中的文档可能类似于:

{
  _id: <auto generated Mongo id>
  fromUserId: <id of user doing the friending>,
  toUserId: <id of user being friended>
}

这是解决这个问题的正确方法。OP应该考虑这个答案。
var query = {_id: { $in: friendslist } };
var options = { fields: { username: 1, profile: 1 } };
return Meteor.users.find( query, options );