使用Mongoid,如何获取集合的集合(通过子文档)?

时间:2016-07-20 18:16:03

标签: ruby mongodb mongoid

我有一个看起来像这样的Mongoid结构:

class Site
  has_many :web_pages
  field :name, type: String
  # ... other stuff
end      

class WebPage
  belongs_to :site
  embeds_one :content
  # ... other stuff
end

class Content
  embeds_many :images
  # ... other stuff
end

class Image
  embedded_in :content
  field :title, type: String
  field :bytes, type: Integer
  # ... other stuff
end

我想要做的是有一个Mongoid查询给出一个站点名称,拉出一组图像记录,但只有标题和字节字段。

我知道我可以通过Ruby迭代地执行此操作...即我可以抓取给定站点的所有WebPages(按名称),遍历它们并为每个抓取它的一条内容记录然后全部该内容的图像,仅采用标题和字节字段。但这是一个N + 1查询,而我确信在单个查询中必须有一种方法可以为给定网站的所有网页提取所有图像(按标题)。

我欢迎任何有关如何使用Mongoid进行安排的建议。

1 个答案:

答案 0 :(得分:0)

由于我仍然需要迭代多个集合,我提出的最好的是:

def build_image_details(site)
  {}.tap do |hash|
    pages = WebPage.where(site: site)
    images = pages.collect { |page| page.content.images }.flatten
    images.each { |image| hash[image.title] = image.bytes }
  end # tap
end

该方法返回一个如下所示的哈希:

{
  "Some Image Title" => 2346435,
  "Another Image Title" => 598438
  # etc.
}

我必须查询获取页面,然后查询每个页面以收集图像(通过内容)。但它确实有效。