2011-11-25 19 views
2

我有一個集合:在收集搜索與自參照對象

{ 
_id - ObjectId 
name - string 
location - string 
.. 
parentId - ObjectId //link to parent object 
} 

我有一個過濾器的查詢和它的作品不錯,甚至爲int值(C#):

var q = Query.Matches(column, new BsonRegularExpression(string.Format("/^{0}/i", name))); 

我應該怎麼爲了搜索父對象的名稱?因爲,使用LINQ,沒有問題,但可以在服務器端進行搜索嗎?

+0

對於你需要一個(自我)的名稱加入,和你在MongoDB中無法做到這一點。將它分爲兩​​個查詢,首先找到與名稱匹配的文檔,然後獲取他們的子項。 – Thilo

回答

2

沒有辦法通過mongodb中引用的對象字段進行搜索。一般來說monogdb不是關係型數據庫,所以在我看來它根本不應該支持任何關係。

有一個衆所周知的方法是創建額外的字段並存儲(反規範化)有關您想要搜索的信息。

因此,改變你的架構如下對父對象名稱搜索:

{ 
_id - ObjectId 
name - string 
location - string 
.. 
parentId - ObjectId //link to parent object, 
parentName 
} 

主要的想法,你應該明白:MongoDB是不是realtional,沒有加入這裏,沒有關係。

+0

我明白了,只是想讓它變小。我在名稱+位置上有一個唯一的索引,所以也許我可以使它成爲_id [名稱,位置],並鏈接parentId [名稱,位置]。 – 1gn1ter

+0

@ 1gn1ter:是的,如果pair [name,location]是唯一的,它也是很好的解決方案。它會給你很容易的搜索父母的名字。 –

5

沒有加入在MongoDB中,但你基本上有兩種選擇:

解決方案1:

  1. :查詢名稱和獲取結果(父母)
  2. 每文件提取,再次查詢並獲取_idparentId匹配的所有文檔(兒童)

解決方案2:

此外,對於parentId,也節省了家長的name與每個文檔和查詢直接parentName

+0

第二種解決方案有更新名稱的成本。 –