10

我已经更新了 mongo,现在在日志中出现以下错误: Use of the aggregate command without the cursor option is deprecated

Mongo 说我应该为聚合函数添加第二个 REQUIRED 参数,因为我目前的用法已被弃用。

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

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

并返回这种格式:

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

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

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

这会返回相同的信息,但会改变初始结构:

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

更新后 Mongo 迫使我改变读取数据的方式。我不明白我应该在名为“光标”的第二个参数中输入什么值......

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

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

更新:

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

为什么?

4

6 回答 6

6

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

batchSize您可以像使用 value 一样指定应该将多少文档读入缓冲区1

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

使用默认值是安全的batchSize

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

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

于 2017-05-08T15:29:09.197 回答
2

从最新的 MongoDB 手册来看,聚合操作已经改变。

没有光标的聚合

MongoDB 3.4 不赞成使用不带游标选项的聚合命令,除非管道包含解释选项。使用聚合命令内联返回聚合结果时,使用默认批量大小游标指定游标选项:{} 或在游标选项游标中指定批量大小:{ batchSize:}。

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

您也可以参考这个 SO question来了解游标参数的用法。

于 2017-05-08T15:12:36.617 回答
2

您必须使用aggregateCursorwhich 返回光标行,而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

于 2017-05-09T03:04:58.377 回答
2

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

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

于 2019-05-03T11:05:25.870 回答
1

假设您使用的是最新的MongoDB PHP 库,您应该能够按照文档'useCursor' => false中的说明传递选项(默认为true)。

于 2017-05-08T11:15:27.110 回答
1

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

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

于 2017-05-10T09:27:45.460 回答