PHP MongoDB - 不推荐使用不带游标选项的聚合命令。什么?

PHP MongoDB - Use of the aggregate command without the cursor option is deprecated. What?

我已更新 mongo,现在日志中出现以下错误: 不推荐使用不带游标选项的聚合命令

Mongo 说我应该将第二个必需参数放入聚合函数,因为我当前的用法已被弃用。

我目前使用以下代码PHP(现已弃用):

$this->db->{$collection}->aggregate($options);

和return这种格式:

{"result":[
    {
    "_id":"xxxxxx",
    "update":[
    {
    "firstUpdateTime":xxxxxx,
    "updateTime":xxxxxxx,
    }
    ],
    "media":[
    {
    "xxxx":{ ...

为了不使用已弃用的代码,我添加了新的第二个参数(但我不明白该放什么):

$this->db->{$collection}->aggregate($options, array('cursor' => array('batchSize' => 101)));

这 return 是相同的信息,但初始结构不同:

{"cursor":{
"id":{
"value":"xxxxxx"
},
"ns":"xxxxxx.instagram",
"firstBatch":[
{
"_id":"xxxxxx",
"update":[
{
"firstUpdateTime":xxxxxx,
"updateTime":xxxxxx,
}
],
"media":[
{
"xxxxxx":{ ...

更新后Mongo迫使我改变读取数据的方式。 我不明白我应该在第二个参数 "cursor"...

中输入什么值

我应该在第二个参数中输入什么? 我可以在不改变结果结构的情况下设置默认值吗?

文档: https://docs.mongodb.com/manual/reference/method/db.collection.aggregate/ http://php.net/manual/es/mongocollection.aggregate.php

更新:

如果我在函数中指示光标,我将不再收到错误。 但是在没有应用到解决方案的情况下,我阅读了 LOG 并且警告随机出现,我有一个代码 运行 几次,有时如果它报告提到的警告而其他人则没有。

为什么?

假设您使用的是最新的MongoDB PHP Library, you should be able to pass 'useCursor' => false option (the default is true) as explained in the doc

从最新的 MongoDB 手册开始,聚合操作已更改。

aggregate without cursor

MongoDB 3.4 deprecates the use of aggregate command without the cursor option, unless the pipeline includes the explain option. When returning aggregation results inline using the aggregate command, specify the cursor option using the default batch size cursor: {} or specify the batch size in the cursor option cursor: { batchSize: }.

您可以通过添加 [ "cursor" => [ "batchSize" => 0 ] ] 为您的函数调用指定该参数,因为第二个参数将解决此问题。参考 here.

游标参数的使用也可以参考这个SOquestion

当您向 MongoDB 查询某些内容并期望得到结果时,您将拥有这个名为 cursor 变量 ,它只是一个指向文档的指针你现在读过。它就像浏览器中的滚动条。

您可以像使用值 1.

一样指定应将多少文档读入缓冲区 batchSize

当您知道您希望阅读多少文档时,它会很有用。当您只需要 10 个文档时,您可以使用 batchSize => 10 在一个网络数据包中获取所有这些文档。当指定 batchSize => 5 时,它会花费更长的时间,因为它确实需要两个网络数据包到数据库才能获得预期的 10 个文档。

您可以安全地使用默认值 batchSize

您可以尝试使用 foreach 遍历光标,就像文档中的示例一样:http://php.net/manual/en/class.mongocommandcursor.php

我不确定 php.net 文档是否与最新版本的 MongoDB 驱动程序保持同步。

您必须使用 aggregateCursor,其中 returns 光标行而不是仅 results

类似

第一批默认设置为 101 个结果。

$cur = $this->db->{$collection}->aggregateCursor($pipeline);

将聚合游标的批大小(您问题的第二个参数)设置为后续批次的 50。如果您不使用下面的选项,默认将获取大约 4 MB。

$cur->batchSize( 50 );

您现在可以迭代和读取结果以获取所有文档。

服务器将在第一个循环迭代中获取初始(第一)批次的 101 个文档,然后在第 102 次迭代中获取后续批次,并在其余批次中以 50 个间隔获取文档,直到您耗尽游标。

foreach ( $cur as $result )
{
   echo $result['_id'], "\n";
}

要控制第一个批次的批次大小,您可以将 batchSize 指定为游标选项,但通常不需要。

$cur = $this->db->{$collection}->aggregateCursor($pipeline, 'cursor' => [ 'batchSize' => 1 ]);

参考: https://derickrethans.nl/aggregation-cursor.html

驱动程序 mongo 已弃用,不支持最新的 PHP 主要版本(例如 PHP 7)。

新驱动程序命名为 mongodb http://php.net/manual/en/set.mongodb.php

替换为:
$this->db->{$collection}->aggregate($options);

使用以下代码添加游标数组。
$this->db->{$collection}->aggregate($options,array('cursor'=>array('batchSize' => 1)));