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

Как запросить MongoDB прямо из Ruby вместо использования Mongoid?

Я пишу миграцию для приложения Rails, которое использует MongoDB и Mongoid. Моя миграция в настоящее время использует мои модели, которые используют Mongoid для запроса и обновления записей, но производительность является суб-пар. Я по существу обновляю все записи в большой коллекции и делая n + 20 запросов. Я убил миграцию после часа, чтобы бежать на месте (и не закончил). Я хотел бы иметь возможность запускать необработанные запросы в mongo без особых усилий. Я предполагаю, что есть какой-то способ получить доступ к монго-драйверу от Mongoid, поскольку Mongoid уже загрузил соединение с базой данных. Как я могу получить доступ к базе данных для непосредственного запуска моих запросов обновления?

4b9b3361

Ответ 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