2016-01-12 82 views
0

可以說我有3個類別:MongoDB的查詢連接優化

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 ==步驟得到1
3.查詢所有的人在那裏祖父母IDS父ids ==父母id從步驟2獲得。

感覺不太高效。 mongodb能幫助我的專家嗎?謝謝!

+0

你在關係模型的方式您的NoSQL數據庫。嘗試嵌入文檔。如果你想有關係的方法只是嘗試RDMS –

+0

我想過使用嵌入的方式,但事情是我也需要能夠過濾父母和人...例如找到所有人的名字= y – user1955934

+0

@Undefined_variable這顯然是錯誤的方法。 [嵌入任意數量的文件是萬惡之源](http://blog.mahlberg.io/blog/2015/11/05/data-modelling-for-mongodb/)。一個[祖先數組](https://docs.mongodb.org/manual/tutorial/model-tree-structures-with-ancestors-array/)或物化路徑是迄今爲止最好的方法。 –

回答

0

我想你想要做這樣的事情。我沒有測試這個查詢,但這是我會在你的地方嘗試。這隻在3.6 mongodb上纔可能,因爲它支持多個連接。這個想法是加入所有3個集合。首先加入的是父母和父母身份的人,以及人的「父母身份」。第二次加入是父母和祖父母。然後你用祖父母的名字過濾掉,你將得到一份包含祖父母,他的兒子(父母)和他的孫子(人)的文件。然後你只需要投影這個人。

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}} 
}]) 

我認爲這將這樣的伎倆