2011-07-04 15 views
0

這裏是我的模型:我如何使用它的集合屬性(acts_as_tree)使用mongoid和mongo控制檯查詢mongo文檔?

class Person 
    acts_as_tree 
end 

我涉及多個對象爲一樹:

  P1 
      | 
     --- 
     | | 
    P1.1 P1.2 
     | 
     --- 
    | | 
P1.1.1 P1.1.2 

這裏,如果我需要中檢索P1.1.1我需要編寫一個有效詢問查詢:

get me the Person with name P1.1.1 and path (given by acts_as_tree) [P1, P1.1]. 

僅僅通過名字查詢是不夠的,因爲我可以在多個路徑上具有相似的命名人員。

我該怎麼做?

> db.people.find({name: 'P1.1.1'}) 

上面的代碼片段會正確顯示路徑屬性,但我無法通過該路徑進行查詢。

> db.people.find({name: 'P1.1.1', path: [{name: 'P1'}, {name: 'P1.1'}]}) 

不起作用。同樣沒有:

> db.people.find({name: 'P1.1.1', path: [db.people.find({name: 'P1'}), 
             db.people.find({name: 'P1.1'})]}) 

但解釋了什麼是我想要做的事。

回答

0

之一,在那裏你可以查詢類似如下的方式:

db.people.find({name : 'Joe', 'path' : { $all : [ObjectId("4e0fcf1722b7a9439200002e"), ObjectId("4e0fcf1622b7a9439200002b")]}}) 

但是我認爲這樣做的缺點是:

  • 你沒有得到替代對象關係/直接加入mongo shell。您必須使用ObjectId對象
  • $ all子句並不要求路徑順序完全相同,這意味着路徑爲「hometown/town /」的名稱爲「Joe」的人也會出現作爲「tome/hometown」的「Joe」。

我會認爲第二個可能是一個交易斷路器。另外,我假定在幾種情況下,mongoid直接將查詢選項傳遞給mongodb(或至少有辦法做到這一點)。因此,應該可以使用上面的給定查詢在Ruby代碼中進行搜索。

不過,我會再做一些重新搜索,並將我的發現發回。

希望它有幫助。

編輯

爲了緩解第二個問題上面還有另一種方式來查詢一個人與一個特定的路徑。在下面找到:

db.people.find({name : 'Joe', 'path.0' :ObjectId("4e0fcf1722b7a9439200002e"), 'path.1':ObjectId("4e0fcf1622b7a9439200002b")}) 

這將確保路徑是你在尋找什麼。然而,這在mongodb shell中起作用,您可能仍然需要弄清楚,mongoid如何運行相當於此。另外,您可能必須動態構建此查詢來爲人員創建路徑,對於深層嵌套人員而言,這可能會變得漫長而難看。

我建議瀏覽以下mongodb文檔鏈接以獲得更好的理解。

http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29

http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-ValueinanArray

我希望這是你所期待的。

+0

使用$ all的另一個問題是Mongo將返回結果,即使該集合的一個子集與您查詢的內容相匹配。爲了說清楚:在上面的例子中,如果路徑將是世界/家鄉/城鎮,那麼如果用家鄉/城鎮路徑搜索,太多$都會返回結果。但另一個帶有自己問題的選項看起來值得一試。我會回來的調查結果。 – vinayvinay