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":{ ...

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

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

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

обновление:

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

Почему?

5 ответов


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

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

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

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

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

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


предполагая, что вы используете последнюю библиотека PHP MongoDB, вы должны быть в состоянии пройти (по умолчанию -true), как описано в doc.


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

что-то вроде

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

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

установите batchsize (второй параметр из вашего вопроса ) на агрегатный курсор 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


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

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

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

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

вы также можете обратиться к этому SO вопрос для использования параметра курсора.


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

новый драйвер с именем mongodb http://php.net/manual/en/set.mongodb.php