我有一个 Angular 应用程序,当它加载时,它会从 mongodb 图集集合中获取所有数据,该集合包含大约 12K 条记录,并且每天都在增加,因此是一个很大的数据集。该数据从 primeng 加载到表中。我们希望表中的所有数据始终可用,以便我们可以查询并查询内存中的整个数据集。我有两个主要问题:
由于数据集很大,现在加载大约需要 10 秒,并且随着我们获得更多数据,显然会增加。所以我想加快速度
数据正在从外部源转储到 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 回调来加载小块数据。
如果你确实想一次性查看任何resone的所有数据,当前版本的primeng支持虚拟滚动,所以你看起来会显示所有数据,但它会从数据库中获取有 block 的数据,但在滚动期间,所以它会提供更好的用户体验
查看👉 loading 250k of data的示例
关于node.js - 如何处理加载大集合的所有记录并监听 mongodb atlas 上的新数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56691110/