Mongoid通过嵌入式文档查找

时间:2015-01-15 14:23:16

标签: ruby mongodb ruby-on-rails-4 mongoid

我有以下嵌入式结构

class CbAuthor
  include Mongoid::Document
  embeds_many: cb_bylines

  field :name, type: String
end

class CbByline
  include Mongoid::Document

  embedded_in :cb_author
  has_many :cb_articles

  field :byline, type: String
end

class CbArticle
  include Mongoid::Document

  belongs_to :cb_byline
end

这是因为作者发布了许多署名或假名,并且会附加到他们的分析报告中。所以,当我有一个署名时,如何找到作者?这将是必要的,因为他们将有仪表板,应该列出他们在所有各自的署名下写的所有文章。

我尝试了CbAuthor.cb_bylines,但这给了我一个无方法错误。或CbAuthor.where(cb_bylines["byline"]: bylineInQuestion)但也会出错。

基本上,我们的目标是让一个作者姓名找到他所有的副标题和与这些副标题相关的文章

1 个答案:

答案 0 :(得分:1)

embeds_many :cb_bylines只是一种奇特的说法"添加一组名为cb_bylines"的哈希值(至少就存储而言)。这意味着你的CbAuthor在MongoDB中看起来像这样:

{ 
  _id: '...',
  name: '...',
  cb_bylines: [
    { _id: '...', byline: '...' },
    ...
  ]
}

MongoDB将展开数组以便为您进行简单查询,这样您就可以只查找'cb_bylines.byline',就像在查询集合中的哈希一样:

authors_by_lined_as_pancakes = CbAuthor.where('cb_bylines.byline' => 'Pancakes McGee')

或者如果您知道只有一个:

pancakes_mcgee = CbAuthor.find_by('cb_bylines.byline' => 'Pancakes McGee')

不要害怕绕过Rails和Mongoid来查看MongoDB中你的数据真实情况。