【问题标题】:Executing MongoDB find queries in PHP在 PHP 中执行 MongoDB 查找查询
【发布时间】:2013-03-21 16:27:37
【问题描述】:

我需要能够从 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
)

为什么其中一个查询有效,而另一个查询失败?我该如何克服这个问题?我曾考虑编写一些东西,将 MongoDB 查询转换为 PHP Mongo 库可以使用的必要数组格式,但这将是很多我不想经历的工作。

这与这里提出的问题相同:How to access MongoDB profile in PHP? - 但当时没有给出答案。

这个问题:PHP MongoDB execute() locking collection 使用带有 find() 的 execute() 方法,他们说它适用于他们,但我不确定如何。

更新:

所以我在 pecl 中更新了 mongo,但这并没有解决任何问题。但是,我也做了一个 YUM 更新,它为 php-pecl-mongo-1.2.12-1.el6.x86_64 提供了一个单独的包更新,使我进入了 1.3.4-1。

现在,$db-&gt;execute('db.&lt;collection&gt;.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
)

如您所见,那里的数据库实际上并没有任何内容:我如何获得我的实际行?

【问题讨论】:

  • 您使用的是最新版本的 PHP mongo 驱动程序吗?
  • find 需要PECL mongo &gt;=0.9.0。你有吗?
  • 是的:pecl list 产生 mongo 1.3.4(现在是 1.3.5 - 刚刚更新,仍然是同样的问题)
  • 您还会在这里找到感兴趣的答案:stackoverflow.com/questions/7700948/… "find() 函数返回一个游标,该游标无法从 JavaScript 中返回。建议的解决方法是使用 toArray()获取数组返回值。”
  • 这与驱动程序的 pecl 版本无关,通过查看 PHP 文档页面:php.net/manual/en/mongodb.execute.php 指定返回值可能会很好,即:$db-&gt;execute('return db.&lt;collection&gt;.find().toArray()')

标签: php mongodb


【解决方案1】:
$m = new MongoClient();
$db = $m-><dbName>;
print_r($db->execute('db.<collection>.toArray()'));

假设您的数据库名称是 test 并且集合名称是 foo 。

print_r($m->test->execute('return db.foo.find().toArray()'));

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,这是我使用执行的解决方案:

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

    我的结果:

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

    【讨论】:

      猜你喜欢
      • 2016-08-13
      • 2011-03-26
      • 2017-12-13
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      • 1970-01-01
      • 2015-06-24
      相关资源
      最近更新 更多