Подтвердить что ты не робот

Как запускать необработанные запросы MongoDB непосредственно в Ruby

Есть ли способ, с помощью которого я могу запустить запрос raw mongo непосредственно в Ruby вместо того, чтобы преобразовывать их в собственные объекты Ruby?

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

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

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

Мой запрос mongo немного велик, и он корректно выполняется на консоли MongoDB. То, что я хочу, - это прямое выполнение внутри Ruby-кода.

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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