使用mongoid(或替代)查询嵌套的嵌入式文档

时间:2012-03-05 09:07:47

标签: ruby mongodb sinatra mongoid

我目前将一系列推文存储为mongodb中的文档,其模式直接映射到流API返回的json。

架构非常详细,有很多嵌套的嵌入式文档,例如

{
  "_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文档中提取链接值。

我有一个简单的Sinatra应用程序,我已经定义了Tweets模型并使用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 个答案:

答案 0 :(得分:1)

如果没有entites密钥,那么您的情况下最好覆盖Entity方法以返回空的entities模型。或者你可以创建一个新的方法entities_url来检查ifg是否有url和or,如果有url则返回值

class Tweet

  def entities
    super || Entity.new
  end

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

end