How to query MongoDB directly from Ruby instead of using Mongoid?

21,596

Solution 1

If you're using Mongoid 3, it provides easy access to its MongoDB driver: Moped. Here's an example of accessing some raw data without using Models to access the data:

db = Mongoid::Sessions.default

# inserting a new document
collection = db[:collection_name]
collection.insert(name: 'my new document')

# finding a document
doc = collection.find(name: 'my new document').first

# iterating over all documents in a collection
collection.find.each do |document|
  puts document.inspect
end

Solution 2

For Mongoid 5:

db = Mongoid::Clients.default

collection = db[:collection_name]

Now we can perform queries on the collection

Solution 3

Here how you do it (This would work for 2+ and 3+ as well)

1) All your Model exhibit this behavior you have include Mongoid::Document inside all your model so technically each document is mapped in monogodb thru moped or mongodb-ruby driver via mongoid

so If you have model Like

class PerformerSource 
  include Mongoid::Document
  ## Definition

end

Now you can run Mongo Query using the driver (Moped or Mongodb-ruby driver) like this

PerformerSource.collection.insert("something")
## where something is json document you want to insert

This would give u the moped (if using mongoid 3) connection for that document

2) You can also do it something like this

 Mongoid::Sessions.default.collections.find { |document| document.name == "performer_sources"}.insert("something")

How to more on mongo query and how mongoid map those using moped u can follow this section of querying where it describe how query is acheived internally via moped

Hope this help

Solution 4

For Mongoid 6:

db = Mongoid::default_client
collection = db[:collection_name]

Solution 5

The short answer is Moped. This is the lower-level API that Mongoid is built upon and will be available if you already use Mongoid. The Moped API is a thin wrapper around the raw MongoDB operations. The documentation here: http://mongoid.org/en/moped/docs/driver.html should be useful.

Share:
21,596
Mike
Author by

Mike

Updated on October 27, 2021

Comments

  • Mike
    Mike over 2 years

    I am writing a migration for a Rails application that uses MongoDB and Mongoid. My migration currently uses my models that use Mongoid to query and update records, but the performance is sub-par. I am essentially updating all records in a large collection and making n+20 queries. I killed the migration after taking an hour to run locally (and didn't finish). I would like to be able to run raw queries to mongo without too much effort. I'm assuming there is some way to access a mongo driver from Mongoid since Mongoid has already loaded a connection to the database. How can I access the database to run my update queries direcly?

  • Mike
    Mike about 11 years
    That's what I thought, but how can I access it? In the docs the examples show Moped::Session.new(host).use(database) but this information is already defined in a configuration file that Mongoid loads automatically. I should be able to access some sort of Moped object from Mongoid. I just don't know how.
  • Ben Ashford
    Ben Ashford about 11 years
    You should be able to get it from Mongoid: Mongoid::Sessions.default will return a Moped::Session from which you can do all the Moped stuff.
  • Niral Munjariya
    Niral Munjariya over 9 years
    Hi Andrew, your answer is useful, but I'm using mongoid and direct access to collections as mentioned in your answer, it works fine but some how after using this mongoid activerecord operations like Model.save, Model.update_attributes,etc. are not working, Can you please suggest some solution(s) for this?
  • Mike
    Mike over 9 years
    Hard to know what's going on without seeing some code samples. I think you should post this as your own question and include a code sample.
  • Niral Munjariya
    Niral Munjariya over 9 years
    Thanks for the reply Andrew, but I found the cause and resolved the same.
  • Charlie
    Charlie about 9 years
    The one that is being marked as answer only works in rails console, but this one, works inside the Model. I'm using Mongoid 4.0.2.
  • Machinerium
    Machinerium over 8 years
    I think it's important to mention that if the file is an script like test.rb , you have to set ` require 'mongoid' `
  • poorva
    poorva over 7 years
    NOTE: The clients will show only when you are connected to a database. Otherwise it will say NameError: uninitialized constant Mongoid::Sessions
  • Bengineer
    Bengineer almost 4 years
    Mongoid::Sessions.default doesn't work anymore, now it is: Mongoid::Clients.default