PHP MongoDB\Client不接受查询中的投影。

3

我有一些包含大量数据的文档,但在特定页面查询时不需要这些数据,因此我想加快请求速度。当我在mongo shell中执行以下查询时:

db.hosts.find({},{dmiSystem: 1, networkInterfaces: 1, lanPrint: 1, pduPorts: 1})"

使用mongo shell时,我几乎可以立即得到我要求的字段。但是,当我使用MongoDB\Client从PHP执行相同的查询时,它需要约5秒钟的时间,与仅运行不带任何参数的find()所需的时间相同。你有什么想法吗?我的代码如下:

$client = new MongoDB\Client("mongodb://localhost:27017");
$collection = $client->selectCollection("consoleServer", "hosts");
$rows = $collection->find(array(),array("_id" => 1, "dmiSystem" => 1,
                          "networkInterfaces" => 1, "lanPrint" => 1,
                          "pduPorts" => 1));
return $rows;
3个回答

2

查找方法需要2个数组。@Henkealg的答案有语法错误。

这是设置投影和限制的正确方法:

$cursor = $collection->find(
    [],
    [
        'limit' => 5,
        'projection' => [
            '_id' => 1,
        ]
    ]
);

请注意,如果您存在打字错误,则不会收到错误提示。例如,projction 代替 projection

1

PHP 的新 MongoDB 库使用了另一种查询语法,它更类似于 Mongo Shell,并使用投影变量。

根据你的示例,你应该能够像这样使用:

$rows = $collection->find(
      array(),
        'projection' => array(
           array(
             "_id" => 1, 
             "dmiSystem" => 1,
             "networkInterfaces" => 1, 
             "lanPrint" => 1,
             "pduPorts" => 1)
        )
    );

更多信息可在Mongodb文档中找到。


"projection"变量是缺失的部分。在mongo shell中,这在find()函数的第二个参数中是隐含的,但在PHP中,这需要另一层具有指定"projection"的关联数组。现在运行良好。谢谢! - Craig Jackson

0
尝试使用以下代码:$rows = $collection->find(array(), array("projection" => array("_id" => 1, dmiSystem" => 1, "networkInterfaces" => 1, "lanPrint" => 1, "pduPorts" => 1)));

请您能否添加更多的细节,并将您的代码正确进行缩进处理。 :) - surajs1n

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接