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おりPHP 5.3.13driver 1.2.10 PS これを試着しましたPHP 5.4.16が、状況は同じです

4

1 に答える 1

2

このコマンドは、 evalコマンドを介して呼び出すことはできません(この問題に関する追加の議論については、このスレッドを参照してください)。JS メソッドを使用する代わりに、 MongoDB::command()を使用してcopydbコマンドを直接呼び出すことができます。次のスクリプトは、オプションを省略したため、同じサーバー上の 2 つのデータベース間でコピーします。fromhost

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