Question

I have a MongoDB database that uses mongoid referencing according to the documentation. Here are my models:

class Mydoc
  include Mongoid::Document
  # ...
  has_and_belongs_to_many :editors, class_name: 'User',  inverse_of: nil
  # ...
end 

and

class User
  # actually, it's based on devise with some changes
  # ...
  # it does not reference back to Mydoc, see inverse_of there!
end

Now if I make a reference to a user (to grant her/him editor role), mongoid creates an array field called editor_ids that contains object ids of the documents in the users table. Works nice.

I'd like to have a query that shows all Mydoc documents where a certain user is editor. Can't figure out how to do that in mongoid. It's very simple in the mongo console:

db.mydocs.find({ editor_ids: { $in: [ ObjectId("52c97e58b878bcf156000001") ] } })

It works like charm. But I need this in rails, not in the console. Based on mongoid docs, I've tried this (and a hell lot of variations of it) but it does not work:

@docs_where_editor = Mydoc.where(:editors.in => [@user._id])

the result is an empty dataset. I would appreciate any hint.

I suppose it's not the where method, since in mongoid, find only accepts object ids you want to find.

Was it helpful?

Solution

If you have an :editor_ids array and you're only looking for a single value then you should be able to use multi-keys thusly:

Mydoc.where(:editor_ids => @user.id)

and if you have several editor IDs to search for then:

Mydoc.where(:editors_ids.in => array_of_user_ids)

would be the transliteration of your MongoDB console query to Mongoid.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top