Как справиться с загрузкой всех записей большой коллекции и прослушиванием новых данных на атласе mongodb? - PullRequest
1 голос
/ 20 июня 2019

У меня есть угловое приложение, которое при загрузке получает все данные из коллекции атласа mongodb, имеющей около 12К записей, и увеличивается с каждым днем, поэтому большой набор данных.Эти данные загружаются в таблицу из примера.Мы хотим, чтобы все данные всегда были доступны в таблице, чтобы мы могли запрашивать, видеть и запрашивать весь набор данных в памяти.У меня есть две основные проблемы:

  1. Поскольку набор данных большой, загрузка занимает около 10 секунд, и, очевидно, будет увеличиваться по мере получения новых данных.Поэтому я хочу ускорить это

  2. Данные сбрасываются в атлас mondogb из внешнего источника.После загрузки данных на веб-сайт я хочу иметь возможность прослушивать поступающие новые данные и обновлять свой пользовательский интерфейс без необходимости перезагружать страницу из-за пункта 1), который я сделал выше.Как я могу это сделать?

Я изучал различные темы в Интернете, такие как redis с mongodb, также видел этот ответ, в котором говорится о наблюдении за изменениями в коллекции mongodb: Как выслушать изменения в коллекции MongoDB?

С чем мне тяжело работать, так это как реализовать все это вместе, так как я новичок в угловых и этой теме обработки больших данныхустанавливает эффективно.

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

ngOnInit() {
  this.selectedColumns = this.cols;
  this.loading = true;
  this.handleEventData();
  this.setCustomFilters();
}

handleEventData = async function() {
  this.eventService.getEvents().subscribe((data: any[]) => {
    this.events = this.flattenEventData(data);
    this.makeEventDataUserFriendly(this.events);
    this.setDistinctOptions(this.events);
    this.loading = false;
  })
}
<p-table [value]="events" #dt [columns]="selectedColumns" [paginator]="true" [rows]="250" [loading]="loading"
  [autoLayout]=true [reorderableColumns]="true" [rowsPerPageOptions]="['250','500','1000']" dataKey="_id"
  rowExpandMode="single" selectionMode="single">

А вот код, который вызывается при выполнении this.eventService.getEvents().fieldsToIgnore имеет список полей, которые я не хочу включать в результат.Я использую monk в качестве моего драйвера БД:

exports.GetEvents = function() {
  return db.events
    .find({}, {
      sort: {
        createdAt: -1
      },
      fields: fieldsToIgnore
    })
    .then(docs => docs)
    .catch();
};

1 Ответ

1 голос
/ 20 июня 2019

Реализация р-таблицы

<p-table [value]="events" #dt [columns]="selectedColumns" [paginator]="true" [rows]="250" [loading]="loading"
  [autoLayout]=true [reorderableColumns]="true" [rowsPerPageOptions]="['250','500','1000']" dataKey="_id"
  rowExpandMode="single" selectionMode="single">

нет необходимости запрашивать все данные, и это неэффективно и повлияет на производительность всех вас или приведет к сбою браузера.

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

? таблица ленивого режима

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

проверьте пример 101 загрузка 250 КБ данных

...