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

标签 node.js angular primeng mongodb-atlas monk

我有一个 Angular 应用程序,当它加载时,它会从 mongodb 图集集合中获取所有数据,该集合包含大约 12K 条记录,并且每天都在增加,因此是一个很大的数据集。该数据从 primeng 加载到表中。我们希望表中的所有数据始终可用,以便我们可以查询并查询内存中的整个数据集。我有两个主要问题:

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

  2. 数据正在从外部源转储到 mondogb atlas。一旦我在网站中加载数据,我希望能够监听传入的新数据并更新我的 UI,而无需重新加载页面,因为我上面提到的第 1) 点。我怎样才能做到这一点?

我已经研究了不同的在线主题,例如 redis 和 mongodb,也看到了这个关于监视 mongodb 集合上的更改的答案:How to listen for changes to a MongoDB collection?

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

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

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表

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

👉 table lazy mode

如果你确实想一次性查看任何resone的所有数据,当前版本的primeng支持虚拟滚动,所以你看起来会显示所有数据,但它会从数据库中获取有 block 的数据,但在滚动期间,所以它会提供更好的用户体验

查看👉 loading 250k of data的示例

关于node.js - 如何处理加载大集合的所有记录并监听 mongodb atlas 上的新数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56691110/

相关文章:

node.js - 如何使用 SSL 在本地端口 80 - 443 上公开带有 DDEV Web 容器的 Nodejs 应用程序

javascript - Node ffi Rect 类型

Angular 6 http POST - 将参数设置为 URL 中的查询字符串

angular - PrimeNg 自动完成在清除时发送空字符串

ajax - 如何在本地主机上使用 fetch 发出 CORS 请求?

javascript - 从客户端获取消息 Discord.js

angular - 在angular2中使用 snackbar (entryComponents)时如何发出事件

ios - <输入类型 ="file"选择文件后重新启动 Ionic 应用程序

css - 如何添加垂直面板并将其用作 Angular 中的切换器?

angular - 检查 p-multiSelect PrimeNG 的列选项的元素在数组末尾添加相关列