¿Cómo consultar MongoDB directamente desde Ruby en lugar de usar Mongoid?


Estoy escribiendo una migración para una aplicación Rails que usa MongoDB y Mongoid. Mi migración actualmente utiliza mis modelos que utilizan Mongoid para consultar y actualizar registros, pero el rendimiento es inferior. Esencialmente estoy actualizando todos los registros de una gran colección y haciendo n + 20 consultas. Maté la migración después de tomar una hora para ejecutar localmente (y no terminé). Me gustaría poder ejecutar consultas raw a mongo sin demasiado esfuerzo. Asumo que hay alguna forma de acceder a un mongo driver de Mongoid ya que Mongoid ya ha cargado una conexión a la base de datos. ¿Cómo puedo acceder a la base de datos para ejecutar mis consultas de actualización directamente?

Author: smartmeta, 2013-02-11

6 answers

Si está utilizando Mongoid 3, proporciona un fácil acceso a su controlador MongoDB: Ciclomotor. Aquí hay un ejemplo de cómo acceder a algunos datos sin procesar sin usar Modelos para acceder a los datos:

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
 32
Author: Andrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-08 23:42:30

Aquí cómo lo haces (Esto funcionaría para 2+ y 3+ también)

1) Todo su Modelo exhibe este comportamiento que tiene incluye Mongoid:: Document dentro de todo su modelo, por lo que técnicamente cada documento se mapea en monogodb a través de ciclomotor o mongodb-ruby driver a través de mongoid

Así que si tienes un modelo Como

class PerformerSource 
  include Mongoid::Document
  ## Definition

end

Ahora puede ejecutar la consulta Mongo usando el controlador (controlador Moped o Mongodb-ruby) de la siguiente manera

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

Esto le daría a u el ciclomotor (si usa mongoid 3) conexión para ese documento

2) También puedes hacerlo algo como esto

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

Cómo obtener más información sobre la consulta mongo y cómo mapear mongoid aquellos que usan ciclomotor u pueden seguir esta sección de consulta donde describe cómo se obtiene la consulta internamente a través de ciclomotor

Espero que esto ayude

 6
Author: Viren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-13 08:01:43

Para Mongoid 5:

db = Mongoid::Clients.default

collection = db[:collection_name]

Ahora podemos realizar consultas sobre la colección

 5
Author: Venu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-01 14:22:22

La respuesta corta es Ciclomotor. Esta es la API de nivel inferior sobre la que se construye Mongoid y estará disponible si ya utiliza Mongoid. La API de Ciclomotor es una envoltura delgada alrededor de las operaciones raw MongoDB. La documentación aquí: http://mongoid.org/en/moped/docs/driver.html debería ser útil.

 1
Author: Ben Ashford,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-11 17:21:57

Como cualquiera ha mencionado aquí , su respuesta es Ciclomotor. Aquí está mi ejemplo para un script ruby (simple file test.rb)

  1. Definir un mongoid.yml (en este caso , en localhost)

development: sessions: default: database: test_development hosts: - localhost:27017 options: 2. Set load config and test collection

#!/usr/bin/env ruby
require 'mongoid'

Mongoid.load!("path/to/file/mongoid.yml",:development) # :development corresponds to mongoid.yml first line environment
db = Mongoid::Sessions.default
puts "Collection documents count :> #{db[:collection].find.count}"
 1
Author: Machinerium,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-14 03:20:28

Si usas mongoid 5(cinco) te recomendaría usar esto.

Item.collection.update_one({_id:  BSON::ObjectId('55512b7070722d22d3050000')}, '$set' => { 'category_name': 'Test' })

El truco para esto es el BSON::ObjectId. Esto es como en la consulta mongo si desea buscar un solo id.

db.items.update({ '_id': ObjectId("55512b7070722d22d3050000") }, { $set: {'category_name': 'Test' } })

Arriba está la versión mongo de la consulta. Encontré que traducir código ruby a código mongo es la parte difícil, ya que hay algunas piezas que pueden ser un poco difíciles de encontrar en la documentación.

Http://www.rubydoc.info/gems/mongo/Mongo%2FCollection%3Aupdate_one

 0
Author: Brandt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-01 14:23:31