2013-07-01 23 views
3

我想在Mongo中運行一些服務器端JS。我試圖執行的操作如下:異常:不能temprelease嵌套鎖

db.dropDatabase(); // removing current database 
db.copyDatabase('db_dump', 'db', 'localhost'); // substituting it with a dump 

一切正常,非常好。當我保存這個作爲一個功能:

function() { 
    db.dropDatabase(); 
    return db.copyDatabase('db_dump', 'db', 'localhost'); 
} 

,並執行它,一切都還不錯,返回我{"ok" : 1}

但是當我嘗試執行此使用PHP驅動程序:

$db->execute("function(){ db.dropDatabase(); return db.copyDatabase('db_dump', 'db', 'localhost'); }"); 

我得到

{ 
    "retval": { 
     "errmsg":"exception: can't temprelease nested lock", 
     "code":10298, 
     "ok":0 
    }, 
    "ok":1 
} 

我的第一個雖然是我只需要ge t出了鎖,所以我試過這個

$db->command(
    array(
     '$eval' => "function() { db.dropDatabase(); return db.copyDatabase('db_dump', 'db', 'localhost');}" 
    ), 
    array(
     'nolock'=> true 
    ) 
); 

在這一點上沒有別的東西在使用數據庫。

任何想法如何擺脫這個錯誤?

我正在使用Mongo 2.4.4,PHP 5.3.13driver 1.2.10 P.S.試過這個PHP 5.4.16和情況是一樣的

+0

,你可能要檢查[這](https://groups.google.com/forum/#!topic/mongodb的用戶/ GGLqwEsJwVg) – DevZer0

回答

2

這個命令不能通過eval命令(請參閱this thread關於此事的一些額外的討論)調用。而不是使用JS方法,您可以直接調用copydb命令MongoDB::command()。下面的腳本將兩個數據庫之間的複製在同一臺服務器上,因爲我省略了fromhost選項:

$m = new MongoClient(); 
$m->a->drop(); 
$m->admin->command([ 
    'copydb' => 1, 
    'fromdb' => 'b', 
    'todb' => 'a', 
]);