使用Meteor中另一个集合的信息发布数据

时间:2014-12-18 15:23:40

标签: mongodb meteor underscore.js aggregation-framework

我有两个集合: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一起使用。有什么想法吗?

1 个答案:

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

重要的细节是,您必须将第一个查询仅限制为contactsconversations字段,否则每次autorun中的任何字段都会重新运行Meta文件变更。

您可能还应该添加一些检查,例如,如果相应的Meta文档不存在,该怎么办。或者如果字段(数组)不存在。