如何处理加载大集合的所有记录并监听 mongodb atlas 上的新数据?

How to handle loading all records of a big collection and listening for new data on mongodb atlas?

我有一个 angular 应用程序,当它加载时从 mongodb 地图集集合中获取所有数据,该集合有大约 12K 条记录,每天都在增加,因此是一个庞大的数据集。此数据从 primeng 加载到 table 中。我们希望 table 中的所有数据始终可用,这样我们就可以在内存中查询查看和查询整个数据集。我有两个主要问题:

  1. 由于数据集很大,现在加载大约需要 10 秒,而且显然会随着我们获得更多数据而增加。所以我想加快速度

  2. 正在从外部源将数据转储到 mondogb atlas 中。将数据加载到网站后,我希望能够侦听传入的新数据并更新我的 UI,而无需重新加载页面,因为我在上面所做的第 1) 点。我该怎么做?

我在网上研究了不同的主题,比如使用 mongodb 的 redis,还看到了这个关于在 mongodb 集合上观察变化的答案:How to listen for changes to a MongoDB collection?

我遇到困难的是如何一起实现它,因为我是 angular 和高效处理大型数据集这个主题的新手。

下面是在页面加载时将数据加载到 table 的代码片段。

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();
};

你实现了 p-table

<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 table 支持 Lazy 模式处理大型数据集很方便,每次分页、排序和过滤时调用 onLazyLoad 回调加载小块数据,而不是加载整个数据。

table lazy mode

如果你确实希望看到所有数据一次,因为任何 resone 当前版本的 primeng 支持虚拟滚动,所以你看起来会显示所有数据,但它会从数据库中获取数据块,但在滚动过程中,所以它将提供更好的用户体验

检查 loading 250k of data

的示例