MongoDBとMongoidを使用するRailsアプリケーションの移行を作成しています。私の移行では現在、Mongoidを使用してレコードのクエリと更新を行うモデルを使用していますが、パフォーマンスは標準以下です。私は基本的に、大規模なコレクションのすべてのレコードを更新し、n+20のクエリを実行しています。ローカルで実行するのに1時間かかった後、移行を強制終了しました(そして終了しませんでした)。あまり労力をかけずに、mongoへの生のクエリを実行できるようにしたいと思います。Mongoidはすでにデータベースへの接続をロードしているので、Mongoidからmongoドライバーにアクセスする方法があると思います。データベースにアクセスして更新クエリを直接実行するにはどうすればよいですか?
7 に答える
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
Mongoid 5の場合:
db = Mongoid::Clients.default
collection = db[:collection_name]
これで、コレクションに対してクエリを実行できます
ここでそれをどのように行うか(これは2+と3+でも機能します)
1)すべてのモデルは、すべてのモデル内にMongoid :: Documentを含めたこの動作を示します。したがって、技術的には、各ドキュメントは、モペットまたはmongodb-rubyドライバーを介してmongoidを介してmonogodbにマッピングされます。
だからあなたが好きなモデルを持っているなら
class PerformerSource
include Mongoid::Document
## Definition
end
これで、次のようなドライバー(MopedまたはMongodb-rubyドライバー)を使用してMongoQueryを実行できます。
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クエリの詳細と、moped uを使用しているMongoidマップの詳細については、クエリのこのセクションに従って、mopedを介して内部でクエリを実行する方法について説明します。
この助けを願っています
Mongoid 6の場合:
db = Mongoid::default_client
collection = db[:collection_name]
簡単な答えは原付です。これは、Mongoidが構築されている下位レベルのAPIであり、すでにMongoidを使用している場合に使用できます。Moped APIは、生のMongoDB操作の薄いラッパーです。こちらのドキュメント:http://mongoid.org/en/moped/docs/driver.htmlが役立つはずです。
誰もがここで言及したように、あなたの答えは原付です。これがrubyスクリプト(単純なファイルtest.rb)の私の例です
- mongoid.ymlを定義します(この場合、ローカルホストで)
development:
sessions:
default:
database: test_development
hosts:
- localhost:27017
options:
ロード構成とテスト収集を設定します
#!/ usr / bin / env ruby require'mongoid'
Mongoid.load!( "path / to / file / mongoid.yml"、:development)#:developmentはmongoid.ymlの最初の行の環境に対応しますdb = Mongoid :: Sessions.default puts "コレクションドキュメント数:>#{db [ :collection] .find.count} "
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