如何使用Mongoid 7.x和MongoDB 3.x重命名集合

时间:2018-04-04 14:42:08

标签: mongodb mongoid moped mongoid6

我有一个使用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显然没有暴露这种看似简单的操作的任何原因?

1 个答案:

答案 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')")