通过嵌入式文档查找 Mongoid

Mongoid find by embedded document

我有以下嵌入结构

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) 但这也会产生错误。

基本上目标是让一个作者的名字找到他所有的署名以及与这些署名相关的文章

embeds_many :cb_bylines 只是 "add an array of hashes called 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 里面的真实情况。