3

PHP の内部から直接 mongodb クエリを実行できるようにする必要がある状況にあり、execute() 関数に問題があります。

次のコードは正しく実行され、データベースから結果を返します。

$m = new MongoClient();
$db = $m-><dbName>;
print_r($db->execute('db.<collection>.count()'));

ただし、count() を find() に置き換えると、次の結果が得られます。

Array
(
    [retval] => Array
        (
            [value] => DBQuery: <dbName>.<collection>-> undefined
        )

    [ok] => 1
)

これらのクエリの 1 つが機能し、もう 1 つが失敗するのはなぜですか? そして、どうすればこの問題を克服できますか?MongoDB クエリを、PHP Mongo ライブラリが動作するために必要な配列形式に変換するものを作成することを考えましたが、それは大変な作業になるので、やりたくありません。

これは、ここで提起された問題と同じです: How to access MongoDB profile in PHP? -しかし、その時点では答えはありませんでした。

この質問: PHP MongoDB execute() ロッキング コレクションは、find() で execute() メソッドを利用しており、それが機能すると言っていますが、どうすればよいかわかりません。

アップデート:

それで、peclでmongoを更新しましたが、何も解決しませんでした。ただし、YUM の更新も行いました。これにより、php-pecl-mongo-1.2.12-1.el6.x86_64 の個別のパッケージ更新が提供され、1.3.4-1 になりました。

今、$db->execute('db.<collection>.find())何かを返します...しかし、私が期待するものはまったくありません。MongoCursorオブジェクトを返す代わりにArrayが返さretvalれます。フィールドはありますが、実行されたクエリからの実際の情報はありません。次のようになります。

Array
(
    [retval] => Array
        (
            [_mongo] => Array
                (
                    [slaveOk] =>
                    [host] => EMBEDDED
                )

            [_db] => Array
                (
                    [_mongo] => Array
                        (
                            [slaveOk] =>
                            [host] => EMBEDDED
                        )

                    [_name] => test
                )

            [_collection] => Array
                (
                    [_mongo] => Array
                        (
                            [slaveOk] =>
                            [host] => EMBEDDED
                        )

                    [_db] => Array
                        (
                            [_mongo] => Array
                                (
                                    [slaveOk] =>
                                    [host] => EMBEDDED
                                )

                            [_name] => test
                        )

                    [_shortName] => hits
                    [_fullName] => test.hits
                )

            [_ns] => test.hits
            [_query] => Array
                (
                )

            [_fields] =>
            [_limit] => 0
            [_skip] => 0
            [_batchSize] => 0
            [_options] => 0
            [_cursor] =>
            [_numReturned] => 0
            [_special] =>
        )

    [ok] => 1
)

ご覧のとおり、そこにはデータベースから実際には何もありません。実際の行を取得するにはどうすればよいでしょうか?

4

2 に答える 2

1

私は同じ問題を抱えていました。これはexecuteを使用した私の解決策です:

$m = new MongoClient();
$db = $m-><dbName>;
print_r($db->execute('return { count : db.<collection>.count() }'));

私の結果:

Array
(
    [retval] => Array
        (
            [count] => 10
        )

    [ok] => 1
)
于 2015-07-31T18:59:47.007 に答える