以有效的方式将一次搜索的结果作为另一种搜索的一部分

时间:2014-12-02 19:37:02

标签: mongodb meteor

鉴于以下Mongo集合:

  • 包含编写用户ID的大量文章。
  • 大量用户,每个用户都可以关注'大量其他用户。

我的目标是将光标移动到给定用户所关注的任何一位作者撰写的所有文章。

目前我必须分几步完成:

  1. 查找()用户关注的作者
  2. 将此结果转换为ID数组
  3. 查找该阵列中任何用户编写的文章(使用$ in)。
  4. 第2步非常低效。我当前正在获取整个结果,将其重组为数组,然后将其作为查询的一部分发送回数据库。所有这一切都必须在Javascript中完成(在Meteor / Node.js上运行)。

    有更好的解决方案吗?

2 个答案:

答案 0 :(得分:0)

要获取followers集合中所有用户的数组,请使用$ addToSet aggregate命令。

db.followers.aggregate([{ $match: { followerId: 'abcd' } },
     {$group: {_id: 0, following: {$addToSet: '$followeeId'} } }]);

这将为您提供如下结果:

{ id: 0, following: ['xxx', 'yyy', 'zzz'] }

答案 1 :(得分:0)

我想你想在客户端使用游标,所以你需要加入两个集合

您可以使用其中一个软件包执行此操作:https://hackpad.com/Meteor-reactive-join-publication-packages-MpSFfsZrMxa

我正在使用smartPublish,就像这样

服务器:

Meteor.smartPublish("articles", function () {

    this.addDependency("MyJoinCollection","followerId",function(obj){
        //return a cursor of articles written by the followee found
        return Articles.find({author:obj.followeeId})
    })

    // return a cursor corresponding to all the followee of the current user
    return MyJoinCollection.find({followerId:this.userId})
})

客户端

Meteor.subscribe("articles")
//returns all articles from all users that current user is following
Articles.find()

如果您想要特定用户,则必须将其作为参数提供给订阅/发布