3

我正在尝试在 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, PS试了一下PHP 5.3.13,情况还是一样driver 1.2.10PHP 5.4.16

4

1 回答 1

2

不能通过eval命令调用此命令(有关此问题的更多讨论,请参见此线程)。您可以直接使用MongoDB::command()调用copydb命令,而不是使用 JS 方法。以下脚本将在同一服务器上的两个数据库之间复制,因为我省略了该选项:fromhost

$m = new MongoClient();
$m->a->drop();
$m->admin->command([
  'copydb' => 1,
  'fromdb' => 'b',
  'todb' => 'a',
]);
于 2013-07-02T15:15:58.993 回答