在使用MongoDB回调后,如何查询不同集合中的其他文档?

时间:2016-05-31 00:16:50

标签: mongodb mongoose

如何在收到结果后在另一个集合中搜索其他文档?

例如,我有一个名为Posts的大集合和另一个名为Users的大集合。

每个用户都可以创建多个帖子,而其他用户只有与他们成为朋友或跟随他们才能查看这些帖子。以下是User

的示例
{
   _id: 1234,
   name: "Jack",
   username: 'jack',
   friends: [9439, 4957, 2847]
   followers: [9111, 5746, 6576],
   following: [2121, 4382]
}

以下是Post

的示例
{
    _id: 2948,
    text: "Hello World",
    postedBy: 4957
}

由于以上是postedBy用户4957,而上述示例用户Jack是用户4957的朋友,他应该收到此帖子。

由于MongoDB的新用途,我不确定如何处理这个问题,尽管我认为可能需要汇总管道。我猜它需要搜索帖子,获取postedBy,检查它是否存在于登录用户friendsfollowing数组中,然后继续查看下一篇文章。我每次请求只会返回20个帖子的限制。

我无法使用嵌入式文档,因为两种模型都可以随时更改。

1 个答案:

答案 0 :(得分:0)

尝试此查询,如果要在mongodb中使用查询从一个集合到另一个集合,请使用$ lookup

此查询返回与朋友发布的用户集合

db.getCollection('user').aggregate([
{
      $unwind: "$friends"
   },
   {
      $lookup:
        {
          from: "post",
          localField: "friends",
          foreignField: "postedBy",
          as: "friendsPost"
        }
   },
   {
      $match: { "friendsPost": { $ne: [] } }
   }
])

此查询返回此输出

{
    "waitedMS" : NumberLong(0),
    "result" : [ 
        {
            "_id" : 1234,
            "name" : "Jack",
            "username" : "jack",
            "friends" : 4957,
            "followers" : [9111,5746,6576],
            "following" : [2121, 4382],
            "friendsPost" : [ 
                {
                    "_id" : 2948,
                    "text" : "Hello World",
                    "postedBy" : 4957
                }
            ]
        }
    ],
    "ok" : 1.0000000000000000
}