Railsアプリケーションの移行を書いています。現在の移行では、Mongoidを使用してレコードのクエリと更新を行うモデルを使用していますが、パフォーマンスは標準以下です。大規模なコレクションのすべてのレコードを更新し、n + 20クエリを実行します。ローカルで実行するのに1時間かかった後、移行を中止しました(完了しませんでした)あまり努力せずに生のクエリをmongoに実行できるようにしたいと思います。 Mongoidはすでにデータベースへの接続をロードしているので、Mongoidからmongoドライバーにアクセスする方法があると思います。更新クエリを直接実行するためにデータベースにアクセスするにはどうすればよいですか?
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-を介して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を介してクエリが内部でどのように達成されるかを説明します
この助けを願っています
短い答えは Moped です。これはMongoidが構築されている下位レベルのAPIであり、すでにMongoidを使用している場合に使用できます。 Moped APIは、生のMongoDB操作の薄いラッパーです。ここのドキュメント: http://mongoid.org/en/moped/docs/driver.html が役立つはずです。
モンゴイド6の場合:
db = Mongoid::default_client
collection = db[:collection_name]
誰もがここで言及したように、あなたの答えはモペットです。 Rubyスクリプト(単純なファイルtest.rb))の例を以下に示します。
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}"
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