所以我有一个用户集合(mongo DB),其中包含数百万用户。
我使用nodejs作为后端,使用angular js作为前端,使用datatable来显示这些用户。
但是数据表在一个api调用中加载所有用户,加载超过100万用户。
这使我的API响应变慢了两个。
我只需要前50位用户,然后是50位,那么......
服务器堆栈=节点js +角度js + mongo DB
由于
答案 0 :(得分:5)
如果您正在使用包含大量数据的数据表,则应考虑使用服务器端处理功能。
数据表的服务器端处理在此处描述:https://datatables.net/manual/server-side
但是如果你觉得懒得在服务器上实现这个,你可以使用第三方:
希望这有帮助。
答案 1 :(得分:1)
使用分页来解决客户端尝试从服务器(和数据库)获取用户然后将其呈现为数据表的方法。我已经看到了一些解决分页的方法,我们假设您正在使用REST。
这样做的一种方法是让您的API以:
结尾<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:onClick="Contract"
android:layout_margin="10dp"
app:cardCornerRadius="7dp"
android:layout_height="90dp">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Imageview
android:layout_width="wrap_content"
android:gravity="left"
android:background="@color/colorPrimary"
android:src="drawable/image_triangle"
android:layout_height="match_parent" />
.
.
.
</LinearLayout>
</android.support.v7.widget.CardView>
意思是,客户端会询问您的服务器用户(使用默认排序)并跳过它找到的前100个结果并检索接下来的50个用户。
另一种方法是让你的API像这样(我真的不喜欢这种方法):
/api/users?skip=100&limit=50
意思是,客户端将传递哪个页面以及它想要获取的每页结果数。这将导致服务器端计算,因为您需要从250-300获取用户。
你可以在网上阅读更多关于分页的内容。
话虽如此,您的下一个问题是从数据库中获取所需的用户。 MongoDB有两个使用/api/users?page=5&pageSize=50
和skip
的函数,这就是我更喜欢第一个API的原因。您可以按如下方式进行查询:
limit
的更多信息
答案 2 :(得分:1)
首先,您需要为此添加跳过和限制mongo查询 Model.find()。跳过(偏移).limit(极限)
然后您需要做的下一件事是在数据表中启用服务器端处理
如果你正在使用javascript数据表,那么这个小提琴将适合你 http://jsfiddle.net/bababalcksheep/ntcwust8/
对于角度数据表
http://l-lin.github.io/angular-datatables/archives/#/serverSideProcessing
如果你想发送自己的参数,另一种方法
$scope.dtOptions = DTOptionsBuilder.newOptions()
.withOption('serverSide', true)
.withOption('processing', true)
.withOption('ajax', function (data, callback, settings) {
// make an ajax request using data.start and data.length
$http.post(url, {
draw: draw,
limit: data.length,
offset: data.start,
contains: data.search.value
}).success(function (res) {
// map your server's response to the DataTables format and pass it to
// DataTables' callback
draw = res.draw;
callback({
recordsTotal: res.meta,
recordsFiltered: res.meta,
draw: res.draw,
data: res.data
});
});
})
你将获得每页的长度和偏移量作为.withOption(&#39; ajax&#39;,fun ...)部分中数据对象的起始变量,并从那里你可以在get请求中将其作为params传递例如/route?offset=data.start&limit?data.length或使用上面示例中的post请求
On hitting next button in table this function will automatically trigger with limit and start and many other datatable related value
答案 3 :(得分:1)
@mahesh 当加载页面时创建2个变量让我们说skipVar = 0并限制用户点击下一个发送时* skipVar值键跳过
var skipVar =0
on page load skip=skipVar&limit=limit
on next button
skipVar=skipVar*limit
and send Query String as
skip=skipVar&limit=limit