PHP MongoDB - Использование команды aggregate без опции курсора не рекомендуется. Что?


Я обновил mongo, и теперь в журнале появляется следующая ошибка: Использование команды aggregate без опции курсора не рекомендуется

Монго говорит, что я должен добавить второй ОБЯЗАТЕЛЬНЫЙ параметр в агрегатную функцию, потому что мое текущее использование устарело.

В настоящее время я использую следующий 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":{ ...

После обновления Монго заставляет меня изменить способ чтения данных. Я не понимаю, какое значение я должен ввести в этот второй параметр, называемый "курсор"...

Что я должен указать в этом втором параметре? Могу ли я установить значение по умолчанию без изменения структуры результатов?

Документ: https://docs.mongodb.com/manual/reference/method/db.collection.aggregate / http://php.net/manual/es/mongocollection.aggregate.php

ОБНОВЛЕНИЕ:

Если я укажу курсор в функции, я больше не получу сообщение об ошибке. Но, не обращаясь к решению, я читаю ЖУРНАЛ, и предупреждение появляется случайным образом, у меня есть код, который я запускаю несколько раз, и иногда, если он сообщает об упомянутом предупреждении, а другие нет.

Почему?

Author: ephramd, 2017-05-06

5 answers

Когда вы запрашиваете что-то в MongoDB и ожидаете результатов, у вас будет эта переменная , называемая cursor, которая просто является указателем на документ, который вы в данный момент прочитали. Это похоже на полосу прокрутки в браузере.

Вы можете указать, сколько документов он должен считывать в буфер batchSize, как вы сделали со значением 1.

Это полезно, когда вы знаете, сколько документов вы ожидаете прочитать. Когда вам нужно всего 10 документов, вы можете получить их все в одной сети пакет с использованием batchSize => 10. Если указать batchSize => 5, это займет больше времени, потому что для получения ожидаемых 10 документов в базу данных требуется два сетевых пакета.

Вы в безопасности, используя значение по умолчанию batchSize.

Вы можете попробовать выполнить итерацию по курсору с помощью foreach, как в примере в документах: http://php.net/manual/en/class.mongocommandcursor.php

Я не уверен, что php.net документация обновлена до самой последней версии драйвера MongoDB.

 4
Author: DanFromGermany, 2017-05-08 15:29:09

Предполагая, что вы используете последнюю версию PHP-библиотеки MongoDB , вы должны иметь возможность передать опцию 'useCursor' => false (по умолчанию используется true), как описано в документе .

 1
Author: Yohanes Gultom, 2017-05-08 11:15:27

Вы должны использовать aggregateCursor, который возвращает строку курсора вместо results только.

Что-то вроде

Первая партия по умолчанию имеет значение 101 результат.

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

Установите размер пакета (второй параметр из вашего вопроса) на курсоре aggregate равным 50 для последующих пакетов. Если вы не используете нижеприведенную опцию, по умолчанию будет выделено около 4 МБ.

$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

 1
Author: Veeram, 2017-05-09 03:25:05

Из последнего руководства MongoDB операция агрегирования изменилась.

Агрегат без курсора

MongoDB 3.4 запрещает использование команды aggregate без опции курсора , если только конвейер не включает опцию explain. При возврате результатов агрегирования в строке с помощью команды aggregate укажите параметр курсора, используя курсор размера пакета по умолчанию: {} или укажите размер пакета в параметре курсора курсор: {Размер пакета: }.

Вы можете просто указать этот параметр для вызова функции, добавив [ "cursor" => [ "batchSize" => 0 ] ], поскольку второй параметр решит эту проблему. см. здесь.

Вы также можете ссылаться на это ТАК вопрос для использования параметра курсора.

 1
Author: Kris Roofe, 2017-05-23 12:03:01

Драйвер mongo устарел и не поддерживает новейшие основные версии PHP (например, PHP 7).

Новый драйвер, названный как mongodb http://php.net/manual/en/set.mongodb.php

 1
Author: Hett, 2017-05-15 09:40:51