我正在尝试在Mongo中运行一些服务器端JS。我想要执行的操作是:
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
}
我的第一个问题是,我只需要摆脱锁定,所以我尝试了这个
$db->command(
array(
'$eval' => "function() { db.dropDatabase(); return db.copyDatabase('db_dump', 'db', 'localhost');}"
),
array(
'nolock'=> true
)
);
此时没有其他人在使用数据库。
任何想法如何摆脱这个错误?
我正在使用Mongo 2.4.4
,PHP 5.3.13
和driver 1.2.10
附:在PHP 5.4.16
上尝试过,情况相同
答案 0 :(得分:2)
无法通过eval命令调用此命令(有关此事项的其他讨论,请参阅this thread)。您可以直接使用copydb调用MongoDB::command()命令,而不是使用JS方法。以下脚本将在同一服务器上的两个数据库之间进行复制,因为我省略了fromhost
选项:
$m = new MongoClient();
$m->a->drop();
$m->admin->command([
'copydb' => 1,
'fromdb' => 'b',
'todb' => 'a',
]);