Mongodb查询连接优化

时间:2016-01-12 05:46:29

标签: sql mongodb join

假设我有3个收藏:

Grandparents
{
 _id:1,
 name:old foo
}

Parents
{
_id:2,
grandparentId:1,
name: foo
}
Person
{
_id: 3,
parentId:2,
name: youngfoo
}

如何优化查询以查找所有人的祖父母姓名= x?

在这种情况下,名称不是唯一的。

到目前为止我能想到的是:
1.查询姓名为x的所有祖父母 2.查询祖父母ids ==祖父母ids从步骤1得到的所有父母 3.查询父ids ==从步骤2得到的父ids的所有人。

感觉不是很有效率。 mongodb专家可以帮帮我吗?谢谢!

1 个答案:

答案 0 :(得分:0)

我想你想做这样的事情。我没有测试这个查询,但这是我会在你的地方尝试的。这仅适用于3.6 mongodb,因为它支持多个连接。我们的想法是加入所有3个系列。第一次加入是父母和父母身份的人,以及人员“parentsId”。第二次加入是父母和祖父母。然后你用祖父母名字过滤掉你会得到一份包含祖父母,他的儿子(父母)和他的孙子(人)的文件。然后你只是预测这个人。

    db.Parents.aggregate([
       {
          $lookup:{
             from:"Person",
             localField:"_id",
             foreignField:"parentId",
             as:"Person"
          }
       },
       {
          $unwind:"$Person"
       },
       {
          $lookup:{
             from:"Grandparents",
             localField:"grandparentId",
             foreignField:"_id",
             as:"Grandparents"
          }
       },
       {
          $unwind:"$Grandparents"
       },
       {$match:{Grandparents.name:"x"}},
       {$project:{Person.name:1,Person._id:1}}
}])

我认为这会解决问题