1

rubyからmongodbcloneCollectionコマンドを呼び出そうとしています。https://github.com/mongodb/mongo-ruby-driver/wiki/FAQの最初の質問に基づいて、次のテストスクリプトを作成しました。

require "mongo"
include Mongo

db = MongoClient.new("localhost", 27017).db("test")

coll = "users2"
cmd = {}
cmd['cloneCollection'] = coll
cmd['from'] = "test.example.com:27017"
db.command(cmd)

ただし、users2コレクションのクローンを作成する代わりに、同じ名前の空のデータベースを作成します。私が間違っていることを理解することはできません。何か案は?ありがとう!

4

2 に答える 2

2

次のRubyプログラムは、ソースと宛先のmongodサーバーの起動を備えた、質問に答える自己完結型の実用的な例です。

cloneCollectionのargは、完全修飾名である必要があるようです。たとえば、「test」データベースの「users」コレクションの場合は「test.users」です。

require "mongo"

# startup source and destination mongod servers
source = { 'port' => 27018, 'dbpath' => 'data27018' }
dest = { 'port' => 27019, 'dbpath' => 'data27019' }
[ source, dest ].each do |server|
  dbpath = server['dbpath']
  system("rm -fr #{dbpath} && mkdir #{dbpath} && mongod --port #{server['port']} --dbpath #{dbpath} &")
end

sleep 10 # delay for mongod startup

db_name = 'test'
coll_name = 'users'
db_coll_name = "#{db_name}.#{coll_name}"

# create source collection
db = Mongo::MongoClient.new("localhost", source['port']).db(db_name)
coll = db[coll_name]
coll.insert({'name' => 'Gary'})

# cloneCollection from source to dest
db = Mongo::MongoClient.new("localhost", dest['port']).db(db_name)
cmd = BSON::OrderedHash.new
cmd['cloneCollection'] = db_coll_name
cmd['from'] = "localhost:#{source['port']}"
db.command(cmd)
# verify cloneCollection
p db[coll_name].find.to_a

# kill mongod servers
pids = `pgrep mongod`.split(/\n/).sort.slice(-2,2)
system("kill #{pids.join(' ')}")

ご不明な点がございましたら、お気軽にお問い合わせください。

于 2013-01-03T17:40:54.997 に答える
0

Mongo::DB方法がないことに驚いてcloneCollection、上記の@Gary Murakamiの優れた答えを読んだ後、私は他の人に役立つかもしれないこのモンキーパッチを書きました。

class Mongo::DB
  def cloneCollection(remote_host, collection_name)
    cmd = BSON::OrderedHash.new
    cmd['cloneCollection'] = name + "." + collection_name
    cmd['from'] = remote_host
    self.command(cmd)
  end
end

ソースファイルの任意の場所にドロップするだけで、Mongo::DB.cloneCollection実装を取得できます。

于 2014-11-11T17:52:37.493 に答える