我有两个集合:Meta和普通用户集合。 Meta集合具有以下结构:
{
userId: ObjectId,
contacts: [Array],
conversations: [Array]
}
每个用户在Meta集合中都有相应的不同文档。现在,我想发布属于当前用户的联系人或会话数组的用户。
{
userId: 123,
contacts: ['a', 'b', 'c'],
conversations: ['a', 'e']
}
对于用户123
,我想发布用户a,b,c和e的用户个人资料数据。基本上是联系人和会话数组的所有不同值。
我尝试合并数组并使用`_.uniq'在发布函数内的新数组上,但我需要这个是反应性的,所以当用户添加新联系人时,联系人列表可以被动地更新。有些东西告诉我Mongo的聚合框架可以提供帮助,但我不确定如何将它与Meteor一起使用。有什么想法吗?
答案 0 :(得分:0)
您可以使用reactive-publish包(我是作者之一):
Meteor.publish('profiles', function (userId) {
this.autorun(function (computation) {
var meta = Meta.findOne({userId: userId}, {fields: {contacts: 1, conversations: 1}});
return Meteor.users.find({_id: {$in: meta.contacts.concat(meta.conversations)}}, {fields: {profile: 1}});
});
});
重要的细节是,您必须将第一个查询仅限制为contacts
和conversations
字段,否则每次autorun
中的任何字段都会重新运行Meta
文件变更。
您可能还应该添加一些检查,例如,如果相应的Meta
文档不存在,该怎么办。或者如果字段(数组)不存在。