我有一个使用Ruby 2.2.2的测试应用程序,并使用Mongoid 7.0.0和Moped 1.5.3与MongoDB 3.6.2 - 我们正在使用Mongoid 4.x和MongoDB 2.6升级一个古老的代码库,并发现许多破坏 - 一路上API的变化
最严重的是我们曾经能够做SomeModel.collection.rename但是这个API方法现在不再存在(据我所知)并且给出了一个未定义的错误
我也尝试了以下内容:
Mongoid.default_client.command({ renameCollection: "test.some_collection", to: "test.some_collection2", dropTarget: true })
然而,这会返回
Mongo::Error::OperationFailure: renameCollection may only be run against the admin database. (13)
但是,从命令shell中,我可以发出:
db.some_collection.renameCollection("some_collection2")
这是有效的 - 这似乎是我唯一可以看到的最后一个问题,我如何将其作为一个Moped命令发出? (我对语法方案并不太熟悉)
此外,Mongoid显然没有暴露这种看似简单的操作的任何原因?
答案 0 :(得分:0)
因此找到了一种方法 - 我的一些收藏品存储在不同的数据库中
# returns a hash of client config from mongoid.yml eg ["secondary_db", { "database" => "myDB", hosts => [xxx, xxx, xxx] }]
cfg = Mongoid.clients.select { |k,v| Mongoid.clients[k][:database] == MyModel.storage_options[:database] }.first
# now create a new Client instance using the right database
client = Mongo::Client.new(cfg[1]["hosts"], { database: cfg[1]["database"]})
client.command("$eval" => "db.my_collection.renameCollection('new_col_name')")