2012-03-05 155 views
1

我目前在mongodb中存儲一系列推文,其中的模式直接映射到由流API返回的json。用mongoid(或替代)查詢嵌套嵌入式文檔

該模式非常冗長,嵌入文檔很多,例如嵌套。

{ 
    "_id": ObjectId("4f547c17e948fb6e2e00197d"), 
    "key: value", 
    "...", 
    "...", 
    "entities": { 
    "urls": [ 
     { 
     "indices": [ 
      58, 
      78 
     ], 
     "display_url": "bit.ly\/yJwQsm", 
     "url": "http:\/\/t.co\/x5ccL6So", 
     "expanded_url": "http:\/\/bit.ly\/yJwQsm" 
     } 
    ], 
    } 
    "other parent key pair values here" 
} 

有時網址嵌入將是空的,而其他時候,它將包含一個以上的值(在進一步的陣列狀嵌套[0],[1] [n])的

我想從這個json文檔中提取鏈接值。

我有,我已經定義了一個鳴叫模型,並使用mongoid的動態屬性我能夠從文檔快速輸出值如下簡單的末日應用:

<% @tweets.each do |tweet| %> 
<li><%= tweet._id %></li> 
<li><%= tweet.user.screen_name %></li> 
<li><%= tweet.entities %></li> 

當我嘗試輸出值如

<li><%= tweet.entities.urls %></li> 

我開始看到方法不存在的錯誤。它自己的「tweet.entities」調用將返回嵌套嵌入的內容。有沒有人對我如何檢查嵌入的孩子的存在有任何想法,然後我可以將它們轉換成它?我試圖做的甚至可能與mongoid?此刻我的查詢只是返回完整的文檔。

回答

1

最好在你的情況是覆蓋entites方法返回一個空的Entity模型,如果沒有entities鍵。或者你可以創建一個新梅索德entities_url做檢查IFG的工作有網址和或和返回值,如果有網址

class Tweet 

    def entities 
    super || Entity.new 
    end 

    def entities_url 
    entities.respond_to?(:url) ? entities.url : '' 
    end 

end 
+0

感謝shingara - 我在想一個方法TI檢查如果URL存在與否可能是要走的路。目前在我的應用程序中 - 我剛剛定義了一個Tweet類。我沒有定義實體類 - 我正在使用mongoid的動態字段來訪問實體嵌入 - 我剛剛嘗試了你的代碼,它沒有選擇任何網址 - 我想我可能需要定義和實體類/模型現在 - 抱歉,如果我缺乏紅寶石體驗是一個因素! – 2012-03-05 10:35:08

+0

你可以在沒有實體模型的情況下做同樣的事情,你可以通過例子在'url'鍵上以空值返回一個Hash。這只是返回一個值與有效的鴨子打字。有一些「更自信的代碼」,請參閱@avid對此的評論。 – shingara 2012-03-05 11:12:07

+0

歡呼shingara - 這是非常有益的。我已經接受你的答案。我還設法更好地理解數據如何通過mongoid從mongo返回到ruby,並能夠通過 – 2012-03-05 11:35:09