Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Retrieve an embedded document using Mongoid

I have a Mongoid document called Equipment which can embed multiple Question documents. Here are the document schemas:

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

My issue is that I can retrieve a Question document based on the Question Id. However, my current query returns the parent Equipment document. I would have expected the query to return the embedded Question document. I can eventually get the embedded Question document but I have to loop through all the Question documents of the parent Equipment document.

Here is my current query:

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

Is there a way to directly obtain the embedded Question document?

like image 256
Rich Blumer Avatar asked Feb 17 '23 03:02

Rich Blumer


1 Answers

Because you are using embedded documents, grabbing a single question may not make sense. It does, however, make sense in the context of the parent document. If you really just want a specific question, you can just use normal ARish syntax:

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

I would strongly suggest you make sure you have an index on the question._id field. This will help ensure this query is a fast read operation. Otherwise, Mongo will need to run through all of the Equipment documents and check each of the embedded Question objects.

If the above doesn't work, you can try a nested relation:

Equipment.find(params[:equipment_id]).questions.find(params[:id])
like image 170
Aaron K Avatar answered Feb 23 '23 16:02

Aaron K