Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 使用mongoid(或备选方案)查询嵌套的嵌入文档_Ruby_Mongodb_Sinatra_Mongoid - Fatal编程技术网

Ruby 使用mongoid(或备选方案)查询嵌套的嵌入文档

Ruby 使用mongoid(或备选方案)查询嵌套的嵌入文档,ruby,mongodb,sinatra,mongoid,Ruby,Mongodb,Sinatra,Mongoid,我目前将一系列tweet作为文档存储在mongodb中,其模式直接映射到流API返回的json 模式非常冗长,有许多嵌套的嵌入式文档,例如 { "_id": ObjectId("4f547c17e948fb6e2e00197d"), "key: value", "...", "...", "entities": { "urls": [ { "indices": [ 58, 78 ],

我目前将一系列tweet作为文档存储在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" 
}
有时嵌入的URL将为空,而有时它将包含多个值(在另一个数组中,如嵌套[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做的事可能吗?目前我的查询只返回完整文档。

    在您的情况下,最好的方法是重写
    entites
    方法,以便在没有
    实体
    键的情况下返回空的
    实体
    模型。或者,您可以创建一个新方法e
    entities\u url
    执行检查是否存在url的工作,如果存在url,则返回值

    class Tweet
    
      def entities
        super || Entity.new
      end
    
      def entities_url
        entities.respond_to?(:url) ? entities.url : ''
      end
    
    end
    

    如果没有
    实体
    键,则最好重写
    实体
    方法以返回空的
    实体
    模型。或者,您可以创建一个新方法e
    entities\u url
    执行检查是否存在url的工作,如果存在url,则返回值

    class Tweet
    
      def entities
        super || Entity.new
      end
    
      def entities_url
        entities.respond_to?(:url) ? entities.url : ''
      end
    
    end
    

    谢谢shingara-我在想一种检查url是否存在的方法可能是可行的。目前在我的应用程序中,我刚刚定义了一个Tweet类。我还没有定义实体类-我正在使用mongoid的动态字段访问嵌入的实体-我刚刚尝试了你的代码,但没有找到任何URL-我想我现在可能需要定义和实体类/模型-如果我缺乏ruby经验是一个因素,我很抱歉!您可以在没有实体模型的情况下执行相同的操作,您可以通过示例返回一个在“url”键上具有空值的哈希值。它只是返回一个带有有效duck类型的值。要获得一些“更自信的代码”,请参阅@avid讨论。干杯,辛加拉-这非常有用。我接受了你的回答。我还设法更好地理解了数据是如何通过mongoid从mongo返回到ruby的,并且能够深入到嵌入中……感谢shingara——我在想一种检查url是否存在的方法可能是可行的。目前在我的应用程序中,我刚刚定义了一个Tweet类。我还没有定义实体类-我正在使用mongoid的动态字段访问嵌入的实体-我刚刚尝试了你的代码,但没有找到任何URL-我想我现在可能需要定义和实体类/模型-如果我缺乏ruby经验是一个因素,我很抱歉!您可以在没有实体模型的情况下执行相同的操作,您可以通过示例返回一个在“url”键上具有空值的哈希值。它只是返回一个带有有效duck类型的值。要获得一些“更自信的代码”,请参阅@avid讨论。干杯,辛加拉-这非常有用。我接受了你的回答。我还设法更好地理解了数据是如何通过mongoid从mongo返回到ruby的,并且能够通过…深入到嵌入式