Получить последние N записей в порядке возрастания - PullRequest
0 голосов
/ 17 мая 2018

Как я могу получить последние N записей из MongoDB в возрастающем порядке в PHP?

этот код, который я использую сейчас, возвращает мне последние 60 записей, но он возвращает меня в нисходящем виде.нужно в возрастающей форме.

<?php 
header("Content-type: text/json");
require ($_SERVER['DOCUMENT_ROOT'] . '/grafic/mongodb_php/vendor/autoload.php'); 

$client = new MongoDB\Client;
$traficodb = $client->traficodb;
$trafico_total = $traficodb->trafico_total;

$filter  = [];
$options = ['sort' => ['time_stamp' => -1], 'limit' => 60];

$show = $trafico_total->find($filter, $options);

foreach ($show as $collection) {
    $json[]= [strtotime($collection["time_stamp"])*1000, (int)$collection["tx"], (int)$collection["rx"]];
}
    echo json_encode($json);

?>

Например, если у меня есть строки с отметкой времени: 1,2,3,4,5,6,7,8,9.Я хочу, чтобы результат отображался как 5,6,7,8,9, а не как 9,8,7,6,5

1 Ответ

0 голосов
/ 17 мая 2018

Если это только относительно небольшое количество результатов, которые вы не «разбиваете на страницы» (т. Е. Используете limit и skip), то наиболее эффективным действием было бы просто «сторнировать» возвращенные результаты после преобразования * 1003.*MongoDB\Driver\Cursor как возвращено из MongoDB\Collection::find() в «массив».

Это то, что делает метод драйвера Cursor->toArray(),вместе с array_reverse() в качестве стандартной функции PHP.

$filter  = [];
$options = ['sort' => ['time_stamp' => -1], 'limit' => 60];
$show = array_reverse($trafico_total->find($filter, $options)->toArray());

Затем, когда вы выполняете итерацию списка, результаты располагаются в порядке возрастания, будучи «обратным» тому, что курсор вернул имas.

В качестве альтернативы вы можете использовать use aggregate()

$show = $tracfico_total->aggregate([
  [ '$match' => [] ],
  [ '$sort' => ['time_stamp' => -1 ] ],
  # [ '$skip' => $itemsInPage ],
  [ '$limit' => 60 ],
  [ '$sort' => ['time_stamp' => 1 ] ]
]);

. И вы, как правило, $skip просматривали предыдущие результаты, прежде чем применять свой лимит, а затем пересортировали окончательный результат.Но это на самом деле мало что добавляет к тому, что уже делает обычный запрос, и обычный запрос, вероятно, делает это более эффективно.

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

Другой случай будетобычно для «большого набора результатов», который был бы более подходящим для итерации курсора.В этом случае рекомендуется использовать агрегационный подход, а не преобразовывать курсор в массив «в памяти» вместо простой итерации результатов в возвращенном порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...