¿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?
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
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
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
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.
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)
- 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}"
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
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