1

mongo クライアントで使用するのと同じクエリを使用して、PHP で MongoDB プロファイラーにアクセスしようとしています。

$db = $mongo->selectDB('myapp_db');
$array = $db->execute('return db.system.profile.find();');
echo '<pre>' . print_r($array, true);

しかし、私はこれを取得します:

Array
(
    [retval] => Array
        (
            [value] => DBQuery: myapp_db.system.profile -> undefined
        )

    [ok] => 1
)

プロファイリングが有効になっており、クライアントで正常に動作します。

4

2 に答える 2

1

メソッドMongoDB::setProfilingLevel —このデータベースのプロファイリングレベルを設定します

<?php

$dbname = 'students';
$mongo = (new MongoClient());
$db = $mongo->$dbname;

# 0 (off), 1 (queries > 100ms), and 2 (all queries)
$db->setProfilingLevel(2);

# …
# Some queries 
# …

$response = $db->system->profile->find();
foreach ($response as $query) {
    print_r($query);
}

また:

  • メソッドMongoDB::getProfilingLevel —このデータベースのプロファイリングレベルを取得します
  • メソッドMongoCursor::Explain —クエリの説明を返します。多くの場合、最適化とデバッグに役立ちます
于 2013-02-10T01:17:24.347 に答える
1

PHP 自体を使用できる場合、サーバー/データベースをブロックする JavaScript でクエリを実行する必要はありません。

$mongo = new MongoClient();

// Alternatively, use selectCollection from $mongo->myapp_db
$collection = $mongo->selectCollection('myapp_db', 'system.profile');

foreach ($collection->find() as $document) {
   print_r($document);
}

これにより、単一の配列でMongoDB::execute()応答全体をフェッチする代わりに、結果を反復処理できるため、メモリをより効率的に使用できます。

さらに、元のコードは JavaScript からカーソル (DBQuery オブジェクト) を返します。他のドライバーとの互換性を確保するには、戻る前にcursor.toArray()を呼び出す必要があります。これについては、同様の質問に対する Sammaye の回答 (こちら) で説明されています

于 2013-04-08T21:23:22.740 に答える