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
ОБНОВЛЕНИЕ:
Если я укажу курсор в функции, я больше не получу сообщение об ошибке. Но, не обращаясь к решению, я читаю ЖУРНАЛ, и предупреждение появляется случайным образом, у меня есть код, который я запускаю несколько раз, и иногда, если он сообщает об упомянутом предупреждении, а другие нет.
Почему?
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.
Предполагая, что вы используете последнюю версию PHP-библиотеки MongoDB , вы должны иметь возможность передать опцию 'useCursor' => false
(по умолчанию используется true
), как описано в документе .
Вы должны использовать 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 ]);
Из последнего руководства MongoDB операция агрегирования изменилась.
MongoDB 3.4 запрещает использование команды aggregate без опции курсора , если только конвейер не включает опцию explain. При возврате результатов агрегирования в строке с помощью команды aggregate укажите параметр курсора, используя курсор размера пакета по умолчанию: {} или укажите размер пакета в параметре курсора курсор: {Размер пакета: }.
Вы можете просто указать этот параметр для вызова функции, добавив [ "cursor" => [ "batchSize" => 0 ] ]
, поскольку второй параметр решит эту проблему. см. здесь.
Вы также можете ссылаться на это ТАК вопрос для использования параметра курсора.
Драйвер mongo
устарел и не поддерживает новейшие основные версии PHP (например, PHP 7).
Новый драйвер, названный как mongodb
http://php.net/manual/en/set.mongodb.php