如何实现服务器端呈现数据表,使用node和mongo db?

时间:2017-01-20 13:22:34

标签: node.js mongodb datatable

所以我有一个用户集合(mongo DB),其中包含数百万用户。

我使用nodejs作为后端,使用angular js作为前端,使用datatable来显示这些用户。

但是数据表在一个api调用中加载所有用户,加载超过100万用户。

这使我的API响应变慢了两个。

我只需要前50位用户,然后是50位,那么......

服务器堆栈=节点js +角度js + mongo DB

由于

4 个答案:

答案 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

您可以阅读有关限制功能here和跳过功能here

的更多信息

答案 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