使用Mongoid检索嵌入式文档

问题描述:

我有一个名为Equipment的Mongoid文档,它可以嵌入多个Question文档。这里是文档模式:使用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 

有没有办法直接获得嵌入问题的文件?

因为您使用的是嵌入式文档,所以抓住一个问题可能没有意义。但是,它确实在母文档的上下文中有意义。如果你真的只想要一个具体的问题,你可以使用正常的阿里什语法:

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

我强烈建议你要确保你对question._id领域的指标。这将有助于确保此查询是一个快速读取操作。否则,Mongo将需要遍历所有Equipment文档并检查每个嵌入的Question对象。

如果以上不工作,你可以尝试嵌套关系:

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

感谢您的回应!您提供的两个建议对我而言并不适用。 :-(然而,这对我很有用:equipment = Equipment.find(params [:id]) question = equipment.questions.find(params [:question_id])。关于如何将这两个查询合并为一个? –

+1

@RichBlumer基本上是我写的第二个查询,你只是有不同的名称为你的参数。'question = Equipment.find(params [:id])。questions.find(params [:question_id])' –

+0

我同意。我的问题是我不能像你一样把它们链接在一起,总是在问题上出现错误,没有这样的方法,我只是试着把它链接在一起,而且它工作正常!感谢您的帮助! –

随着轨(3.2.15)和mongoid(3.1.5),我只能做到这样:

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