Я впервые использую MongoDB в своем проекте, и сейчас я сталкиваюсь с большой проблемой. Этот проект используется для хранения огромного количества данных журнала, и теперь мы уже собрали 8 миллионов записей. Я использую библиотеку Laravel MongoDB, созданную jenssegers.
Вот подробности проблем, с которыми я сталкиваюсь с MongoDB.
Мне нужно отобразить журналы в виде таблицы с нумерацией страниц для определенного типа сети, собранной за определенный промежуток времени. Для разбивки на страницы мне нужно знать общее количество отфильтрованных записей. Но, к сожалению, выборочный счет очень медленный в MongoDB .
Вот код, который я использовал для выборочного подсчета
$start_time = new \MongoDB\BSON\UTCDateTime(strtotime($fromDate)* 1000);
$end_time = new \MongoDB\BSON\UTCDateTime(strtotime($tillDate)* 1000);
$totalData = Location::raw(function($collection) use($network_id, $start_time, $end_time) {
return $collection->count(["network_id" => $network_id],['created_at' => array('$gt' => $start_time, '$lt' => $end_time)]);
});
Теперь вторая и самая важная проблема, с которой я сталкиваюсь, это MongoDB слишком медленный при использовании и $ gte, и $ lte . Если я использую только один, то есть $ lte или $ gte, я получаю результаты мгновенно. Но если я использовал оба, то это очень медленно.
Вот код, который я использовал для получения журналов между определенным диапазоном дат
$locations = Location::query();
if (! empty($network_id)) {
$locations = $locations->where('network_id', $network_id);
}
if ($hour != null) {
$locations = $locations->where('created_at','>=',$start_time)
->where('created_at','<=',$end_time);
}
$locations = $locations->offset($start)
->limit(1000)
->orderBy('_id','DESC')
->get();
Вот мои подробные данные о сервере,
Он размещен на AWS на 1-ядерном процессоре Intel® Xeon® R E5-2676 v3 @ 2,40 ГГц с оперативной памятью 1 ГБ и подкачкой 4 ГБ.
Если кто-то имел опыт работы с такой ситуацией, пожалуйста, помогите мне.