使用Mongoid检索嵌入的文档

时间:2013-06-24 14:48:42

标签: ruby mongodb mongoid mongoid3

我有一个名为Equipment的Mongoid文档,它可以嵌入多个问题文档。以下是文档架构:

class Equipment
  include Mongoid::Document
  include Mongoid::Timestamps

  field :description
  field :modelNumber
  field :title
  field :categoryId
  field :subCategoryId
  field :stateId
  field :city
  field :askingPrice

  embeds_many :questions

end

class Question
  include Mongoid::Document
  field :content

  attr_accessible :content

  embedded_in :equipment, :inverse_of => :questions
  embeds_one :answers
end

我的问题是我可以根据问题ID检索问题文档。但是,我当前的查询返回父设备文档。我原以为查询会返回嵌入的问题文档。我最终可以获得嵌入式问题文档,但我必须遍历父设备文档的所有问题文档。

这是我当前的查询:

@question = Equipment.where('questions._id' => Moped::BSON::ObjectId(params[:id])).first

有没有办法直接获取嵌入的问题文档?

2 个答案:

答案 0 :(得分:5)

因为您使用的是嵌入式文档,所以抓住单个问题可能没有意义。但是,它确实在父文档的上下文中有意义。如果你真的只想要一个特定的问题,你可以使用普通的ARish语法:

question = Question.find(params[:id])

我强烈建议您确保在question._id字段上有索引。这有助于确保此查询是快速读取操作。否则,Mongo将需要遍历所有Equipment文档并检查每个嵌入的Question对象。

如果上述方法不起作用,您可以尝试嵌套关系:

Equipment.find(params[:equipment_id]).questions.find(params[:id])

答案 1 :(得分:2)

使用rails(3.2.15)和mongoid(3.1.5)我只能这样做:

@equipment = Equipment.where('questions._id' => Moped::BSON::ObjectId(params[:id])).first
@question = @equipment.questions.find(params[:id])