更新:
- 打消了我的舊的map/reduce方法,因爲我發現了(和Sammaye指出),這改變了結構
- 使我的EXEC版本次要,因爲我發現瞭如何通過renameCollection來完成。
我相信我找到了解決方案。它似乎有些版本的PHP驅動程序會對管理數據庫進行認證,即使它不需要。但是存在a workaround,其中authSource連接參數用於更改此行爲,因此它不會針對管理數據庫進行認證,而是針對您選擇的數據庫進行認證。所以現在我的renameCollection函數只是再次使用renameCollection命令的一個包裝。
關鍵是在連接時添加authSource。在下面的代碼中,$ _ENV ['MONGO_URI']保存我的連接字符串,而default_database_name()返回我要驗證的數據庫的名稱。
$class = 'MongoClient';
if(!class_exists($class)) $class = 'Mongo';
$db_server = new $class($_ENV['MONGO_URI'].'?authSource='.default_database_name());
這是我所使用的eval這也應該工作雖然有些環境不允許你給eval(MongoLab爲您提供了一個殘缺的設置,除非你有一個專用系統)舊版本。但是如果你在分散的環境中運行,這似乎是一個合理的解決方案。
function renameCollection($old_name, $new_name) {
db()->$new_name->drop();
$copy = "function() {db.$old_name.find().forEach(function(d) {db.$new_name.insert(d)})}";
db()->execute($copy);
db()->$old_name->drop();
}
MR將改變文檔結構的兩個集合之間,你應該可以,如果你有合適的身份驗證 – Sammaye
是啊,「用」的管理數據庫,我意識到我張貼這種過早,因爲我沒注意到結構改變。我目前正在設法弄清楚如何在沒有減少部分的情況下進行地圖/縮減。 –
這不是減少問題,但從根本上說,在內部,MongoDB如何形成結果文檔並將其寫出。事實上,你永遠不應該運行reduce,因爲你應該只返回一個關鍵文件,而MongoDBs reduce不會在這種情況下運行 – Sammaye