假设我有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专家可以帮帮我吗?谢谢!
答案 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}}
}])
我认为这会解决问题