Как запустить необработанные запросы MongoDB прямо в Ruby - PullRequest
13 голосов
/ 01 июля 2011

Можно ли как-нибудь запустить необработанный монго-запрос непосредственно в Ruby вместо преобразования их в нативные объекты Ruby?

Я прошел учебник по Ruby Mongo, но нигде не могу найти такой метод.

Если бы это был mysql, я бы запустил запрос примерно так:

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

Мой запрос на монго немного велик, и он правильно выполняется в консоли MongoDB.Я хочу напрямую выполнить то же самое внутри кода Ruby.

Ответы [ 3 ]

23 голосов
/ 02 июля 2011

Вот (возможно) лучший мини-учебник о том, как получить доступ к внутренностям вашего MongoDB.Возможно, это не решит вашу конкретную проблему, но вам нужно получить версию MongoDB SELECT * FROM table.


Прежде всего, вам понадобится Mongo::Connectionобъект.Если вы используете MongoMapper , вы можете вызвать метод класса connection в любой из ваших моделей MongoMapper, чтобы получить соединение, или напрямую запросить MongoMapper:

connection = YourMongoModel.connection
connection = MongoMapper.connection

В противном случае яПолагаю, вы использовали бы конструктор from_uri для создания своего собственного соединения.

Затем вам нужно получить доступ к базе данных, вы можете сделать это с помощью доступа к массиву обозначение , метод db, или получить текущий прямо из 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.

Теперь у вас есть хороший блестящий Mongo::DBэкземпляр в твоих руках.Но вы, вероятно, хотите, чтобы Collection делал что-нибудь интересное, и вы можете получить это, используя запись доступа к массиву или метод collection:

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

Теперь у вас есть что-то, что ведет себя как таблица SQL, так что вы можете count сколько вещей у него есть или запросить его, используя find:

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

И теперь у вас есть то, что вам действительно нужно: горячий из духовки Mongo::Cursor, который указывает на интересующие вас данные. Mongo::Cursor - это Enumerable, поэтому у вас есть доступ ко всем вашим обычным итерирующимся друзьям, таким как each, first, map и один из моихличные избранные, each_with_object:

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

Есть также command и eval методов для Mongo::DB, которыеможет делать то, что вы хотите.

4 голосов
/ 18 мая 2012

Если вы используете mongoid, вы найдете ответ на свой вопрос здесь .

2 голосов
/ 09 июля 2013

Если вы используете Mongoid 3, он обеспечивает легкий доступ к драйверу MongoDB: Мопед . Вот пример доступа к некоторым необработанным данным без использования моделей для доступа к данным:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...