如何处理加载大集合的所有记录并监听 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 中的所有数据始终可用,这样我们就可以在内存中查询查看和查询整个数据集。我有两个主要问题:
由于数据集很大,现在加载大约需要 10 秒,而且显然会随着我们获得更多数据而增加。所以我想加快速度
正在从外部源将数据转储到 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 回调加载小块数据,而不是加载整个数据。
如果你确实希望看到所有数据一次,因为任何 resone 当前版本的 primeng 支持虚拟滚动,所以你看起来会显示所有数据,但它会从数据库中获取数据块,但在滚动过程中,所以它将提供更好的用户体验
的示例
我有一个 angular 应用程序,当它加载时从 mongodb 地图集集合中获取所有数据,该集合有大约 12K 条记录,每天都在增加,因此是一个庞大的数据集。此数据从 primeng 加载到 table 中。我们希望 table 中的所有数据始终可用,这样我们就可以在内存中查询查看和查询整个数据集。我有两个主要问题:
由于数据集很大,现在加载大约需要 10 秒,而且显然会随着我们获得更多数据而增加。所以我想加快速度
正在从外部源将数据转储到 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 回调加载小块数据,而不是加载整个数据。
如果你确实希望看到所有数据一次,因为任何 resone 当前版本的 primeng 支持虚拟滚动,所以你看起来会显示所有数据,但它会从数据库中获取数据块,但在滚动过程中,所以它将提供更好的用户体验
的示例