2011-07-01 8 views
13

Czy istnieje sposób, że mogę wystrzelić surowe zapytanie mongo bezpośrednio w Ruby zamiast konwertować je do rodzimych obiektów Ruby?Jak uruchamiać surowe zapytania MongoDB bezpośrednio w Rubim

Przeszedłem samouczek Ruby Mongo, ale nigdzie nie mogę znaleźć takiej metody.

Gdyby to było mysql, wystrzeliłbym zapytanie coś w tym stylu.

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

Moje zapytanie mongo jest nieco większe i poprawnie wykonywane w konsoli MongoDB. To, czego chcę, to bezpośrednie wykonanie tego samego kodu wewnątrz Ruby.

Odpowiedz

21

Oto (prawdopodobnie) lepszy mini-tutorial, jak dostać się bezpośrednio do odwagi swojej MongoDB. To może nie rozwiązać twojego konkretnego problemu, ale powinno Ci dotrzeć do wersji MongoDB SELECT * FROM table.


Przede wszystkim będziesz potrzebować obiektu Mongo::Connection. Jeśli używasz MongoMapper następnie można wywołać metodę connection klasy na dowolnych MongoMapper modeli, aby uzyskać połączenie lub poprosić MongoMapper do niego bezpośrednio:

connection = YourMongoModel.connection 
connection = MongoMapper.connection 

Inaczej Chyba chcesz użyć from_uri Konstruktor do budowania własnego połączenia.

Następnie trzeba dostać w swoje ręce w bazie danych, można to zrobić pomocą array access notation, metoda db, lub uzyskać obecny jeden prosto z 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. 

Teraz masz ładne lśniąca instancja Mongo::DB w twoich rękach. Ale pewnie chcą Collection zrobić coś ciekawego i można dostać się, że przy użyciu tablicy notacji dostępu lub metodę collection:

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

Teraz masz coś, co zachowuje się trochę jak w tabeli SQL tak można count jak wiele rzeczy ma lub kwerendy go przy find:

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

A teraz masz, co naprawdę jesteś po: gorące z pieca. który wskazuje na dane, które Cię interesują Mongo::Cursor jest Enumerable więc masz dostęp do całej swojej zwykłej iteracji przyjaciół takich jak each, first, map, a jednym z moich ulubionych, each_with_object :

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

Istnieją również metody command i eval na Mongo::DB, które mogą robić, co chcesz.

+1

Taka zgrabna odpowiedź !!! – bragboy

+0

jaka jest wersja mongoid? – Brandt

+0

@newdark Nie widzę tam żadnych odniesień do Mongoida. To było oparte na jakiejkolwiek wersji MongoMappera, która była obecna sześć lat temu, którą AFAIK używał interfejsu Ruby bezpośrednio od ludzi MongoDB. –

4

Jeśli używasz Mongoida, znajdziesz odpowiedź na swoje pytanie here.

2

Jeśli używasz Mongoid 3, zapewnia łatwy dostęp do jego sterownika MongoDB: Moped. Oto przykład uzyskiwania dostępu do niektórych nieprzetworzonych danych bez użycia modeli w celu uzyskania dostępu do danych:

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 
Powiązane problemy