web-dev-qa-db-ja.com

Mongoidを使用する代わりに、MongoDBをRubyから直接クエリする方法は?

Railsアプリケーションの移行を書いています。現在の移行では、Mongoidを使用してレコードのクエリと更新を行うモデルを使用していますが、パフォーマンスは標準以下です。大規模なコレクションのすべてのレコードを更新し、n + 20クエリを実行します。ローカルで実行するのに1時間かかった後、移行を中止しました(完了しませんでした)あまり努力せずに生のクエリをmongoに実行できるようにしたいと思います。 Mongoidはすでにデータベースへの接続をロードしているので、Mongoidからmongoドライバーにアクセスする方法があると思います。更新クエリを直接実行するためにデータベースにアクセスするにはどうすればよいですか?

28
Andrew

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
33
Andrew

Mongoid 5の場合:

db = Mongoid::Clients.default

collection = db[:collection_name]

これで、コレクションに対してクエリを実行できます

10
Venu

ここでそれを行う方法(これは2+と3+でも機能します)

1)すべてのモデルがあなたが持っているこの動作を示しますすべてのモデル内にMongoid :: Documentを含めるので、技術的に各ドキュメントはモペットまたはmongodb-を介してmonogodbにマッピングされますmongoidによるRubyドライバー

だからモデルのような場合

class PerformerSource 
  include Mongoid::Document
  ## Definition

end

これで、次のようなドライバー(MopedまたはMongodb-Rubyドライバー)を使用して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クエリの詳細と、monedがmoped uを使用してそれらをマップする方法 this クエリのセクションで、mopedを介してクエリが内部でどのように達成されるかを説明します

この助けを願っています

6
Viren

短い答えは Moped です。これはMongoidが構築されている下位レベルのAPIであり、すでにMongoidを使用している場合に使用できます。 Moped APIは、生のMongoDB操作の薄いラッパーです。ここのドキュメント: http://mongoid.org/en/moped/docs/driver.html が役立つはずです。

1
Ben Ashford

モンゴイド6の場合:

db = Mongoid::default_client
collection = db[:collection_name]
1
Josh

誰もがここで言及したように、あなたの答えはモペットです。 Rubyスクリプト(単純なファイルtest.rb))の例を以下に示します。

  1. Mongoid.ymlを定義します(この場合は、localhostで)

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}"
1
Machinerium

Mongoidを使用している場合5(five)これを使用することをお勧めします。

Item.collection.update_one({_id:  BSON::ObjectId('55512b7070722d22d3050000')}, '$set' => { 'category_name': 'Test' })

これの秘訣は、BSON :: ObjectIDです。これは、単一のIDを検索する場合のmongoクエリのようなものです。

db.items.update({ '_id': ObjectId("55512b7070722d22d3050000") }, { $set: {'category_name': 'Test' } })

上記は、mongoバージョンのクエリです。 Rubyコードをmongoコードに変換することは、ドキュメントで見つけるのが少し難しい部分があるので、難しい部分です。

http://www.rubydoc.info/gems/mongo/Mongo%2FCollection%3Aupdate_one

0
newdark-it