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 ]);
из последнего руководства 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