2011-07-01 12 views
13

¿Hay alguna forma de que pueda iniciar una consulta de mongo sin procesar directamente en Ruby en lugar de convertirlos a los objetos de Ruby nativos?Cómo disparar consultas de MongoDB sin procesar directamente en Ruby

Fui a través del Tutorial de Ruby Mongo, pero no puedo encontrar tal método en ninguna parte.

Si fuera mysql, habría activado una consulta como esta.

ActiveRecord::Base.connection.execute("Select * from foo") 

Mi consulta de mongo es un poco grande y se ejecuta correctamente en la consola de MongoDB. Lo que quiero es ejecutar directamente lo mismo dentro del código de Ruby.

Respuesta

21

Aquí hay un (posiblemente) mejor mini-tutorial sobre cómo entrar directamente en las entrañas de su MongoDB. Esto podría no resolver su problema específico, pero debería llegar hasta la versión MongoDB de SELECT * FROM table.


Antes que nada, querrá un objeto Mongo::Connection. Si estás usando MongoMapper entonces se puede llamar al método connection clase en cualquiera de sus modelos MongoMapper para conseguir una conexión o pedir MongoMapper por ella directamente:

connection = YourMongoModel.connection 
connection = MongoMapper.connection 

De lo contrario supongo que tendría que utilizar el from_uri constructor para construir su propia conexión.

Luego hay que conseguir sus manos en una base de datos, puede hacerlo utilizando el array access notation, el método db, o conseguir la actual directamente desde MongoMapper:

db = connection['database_name'] # This does not support options. 
db = connection.db('database_name') # This does support options. 
db = MongoMapper.database   # This should be configured like 
            # the rest of your app. 

Ahora usted tienen un buen instancia brillante Mongo::DB en sus manos. embargo, es probable que quieren un Collection para hacer algo interesante y usted puede conseguir que el uso de la notación de acceso a matriz o el método collection:

collection = db['collection_name'] 
collection = db.collection('collection_name') 

Ahora usted tiene algo que se comporta como una especie de tabla de SQL por lo puede count la cantidad de cosas que tiene o consultar utilizando find:

cursor = collection.find(:key => 'value') 
cursor = collection.find({:key => 'value'}, :fields => ['just', 'these', 'fields']) 
# etc. 

Y ahora usted tiene lo que realmente después: una caliente fuera del horno. que apunta a los datos que le interesa es Mongo::Cursor un Enumerable por lo que tiene acceso a toda su iteración habitual amigos como each, first, map, y uno de mis favoritos personales , each_with_object:

a = cursor.each_with_object([]) { |x, a| a.push(mangle(x)) } 

también hay commandeval y métodos en Mongo::DB que podría hacer lo que quiere.

+1

Tal respuesta ordenada !!! – bragboy

+0

¿qué versión de mongoid es esto? – Brandt

+0

@newdark No veo ninguna referencia a Mongoid allí arriba. Que se basaba en cualquier versión de MongoMapper era actual hace seis años, que yo sepa utilizar la interfaz de Rubí directamente de la gente MongoDB. –

4

En caso de que esté utilizando mongoid, encontrará la respuesta a su pregunta here.

2

Si está utilizando Mongoid 3, que proporciona un fácil acceso a su conductor MongoDB: Moped. He aquí un ejemplo de acceder a algunos datos en bruto sin necesidad de utilizar modelos para tener acceso 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 

# "select * from collection" 
collection.find.each do |document| 
    puts document.inspect 
end 
Cuestiones relacionadas