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