Я пишу миграцию для приложения Rails, которое использует MongoDB и Mongoid. Моя миграция в настоящее время использует мои модели, которые используют Mongoid для запроса и обновления записей, но производительность является суб-пар. Я по существу обновляю все записи в большой коллекции и делая n + 20 запросов. Я убил миграцию после часа, чтобы бежать на месте (и не закончил). Я хотел бы иметь возможность запускать необработанные запросы в mongo без особых усилий. Я предполагаю, что есть какой-то способ получить доступ к монго-драйверу от Mongoid, поскольку Mongoid уже загрузил соединение с базой данных. Как я могу получить доступ к базе данных для непосредственного запуска моих запросов обновления?
Как запросить MongoDB прямо из Ruby вместо использования Mongoid?
Ответ 1
Если вы используете 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
# iterating over all documents in a collection
collection.find.each do |document|
puts document.inspect
end
Ответ 2
Вот как вы это делаете (это будет работать и для 2+ и 3+)
1) Вся ваша модель демонстрирует такое поведение, которое у вас включает Mongoid: Document внутри всей вашей модели, поэтому технически каждый документ отображается в моноходном режиме через мопед или драйвер mongodb-ruby через mongoid
so Если у вас есть модель Like
class PerformerSource
include Mongoid::Document
## Definition
end
Теперь вы можете запустить Mongo Query, используя драйвер (мопед или монгодб-рубиновый драйвер), как этот
PerformerSource.collection.insert("something")
## where something is json document you want to insert
Это даст вам мопед (при использовании mongoid 3) для этого документа
2) Вы также можете сделать что-то вроде этого
Mongoid::Sessions.default.collections.find { |document| document.name == "performer_sources"}.insert("something")
Как больше узнать о mongo-запросе и о том, как карта mongoid, использующая мопед u, может следовать этот раздел запроса, где он описывает, как запрос получается внутренне через мопед
Надеемся на эту помощь
Ответ 3
Для Mongoid 5:
db = Mongoid::Clients.default
collection = db[:collection_name]
Теперь мы можем выполнять запросы в коллекции
Ответ 4
Короткий ответ Moped. Это API нижнего уровня, на который построен Mongoid, и будет доступен, если вы уже используете Mongoid. API Moped - это тонкая оболочка вокруг необработанных операций MongoDB. Документация здесь: http://mongoid.org/en/moped/docs/driver.html должна быть полезна.
Ответ 5
Как упоминается здесь, ваш ответ - мопед. Вот мой пример для ruby script (простой файл test.rb)
- Определите mongoid.yml(в этом случае на локальном хосте)
development:
sessions:
default:
database: test_development
hosts:
- localhost:27017
options:
2. Установите конфигурацию загрузки и коллекцию тестов
#!/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}"
Ответ 6
Если вы используете mongoid 5 (пять), я бы рекомендовал использовать это.
Item.collection.update_one({_id: BSON::ObjectId('55512b7070722d22d3050000')}, '$set' => { 'category_name': 'Test' })
Хитростью для этого является BSON:: ObjectID. Это похоже на запрос mongo, если вы хотите найти один идентификатор.
db.items.update({ '_id': ObjectId("55512b7070722d22d3050000") }, { $set: {'category_name': 'Test' } })
Выше - версия запроса манго. Я обнаружил, что перевод кода ruby на mongo-код - это трудная часть, так как есть несколько частей, которые могут быть немного трудно найти в документации.
http://www.rubydoc.info/gems/mongo/Mongo%2FCollection%3Aupdate_one