2013-07-01 24 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', 
]);