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

9cbw7uwe  于 2023-06-29  发布在  Go
关注(0)|答案(5)|浏览(107)

所以我有一个用户集合(mongo DB),它由数百万用户组成。
我使用nodejs作为后端,angular js作为前端,datatable用于显示这些用户。
但是datatable在一个API调用中加载所有用户,加载超过100万用户。
这使得我的API响应速度慢了两个。
我只想第一个50用户,然后下一个50,然后等等...
服务器堆栈= node js + angular js + mongo DB
谢谢

i5desfxk

i5desfxk1#

如果你使用的数据表有大量的数据,你应该考虑使用服务器端处理功能。
服务器端对datatable的处理如下所述:https://datatables.net/manual/server-side
但是如果你懒得在你的服务器上实现它,你可以使用第三方,比如:

希望这能帮上忙。

rqenqsqc

rqenqsqc2#

解决客户端试图从服务器(和数据库)获取用户,然后将其呈现到数据表的方法是使用分页。这里有几种我见过的解决分页的方法,让我们假设你使用REST。
这样做的一种方法是让你的API以以下结尾:

/api/users?skip=100&limit=50

这意味着,客户端将向服务器请求用户(使用默认排序),并跳过它找到的前100个结果并检索接下来的50个用户。
另一种方法是让你的API像这样(我真的不喜欢这种方法):

/api/users?page=5&pageSize=50

这意味着,客户端将传递它想要获取的页面以及每个页面有多少结果。这将导致服务器端计算,因为您需要从250-300个用户中获取用户。
你可以在网上阅读更多的分页。
话虽如此,您的下一个问题是从数据库中获取所需的用户。MongoDB有两个使用skiplimit的函数,这就是我更喜欢第一个API的原因。您可以按以下方式执行查询:

users.find().skip(50).limit(50)

您可以阅读有关限制函数here和跳过函数here的更多信息

vptzau2j

vptzau2j3#

你需要的第一件事是在你的mongo查询中添加skip和limit,就像下面的Model.find().skip(offset).limit(limit)
然后你要做的下一件事是在数据表中启用服务器端处理
如果你正在使用JavaScript数据表,那么这个小工具将为你工作http://jsfiddle.net/bababalcksheep/ntcwust8/
对于Angular 数据表
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('ajax',fun...)部分的数据对象中的开始变量,从那里你可以将其作为参数传递到get请求中,例如:/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
nuypyhwy

nuypyhwy4#

@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
ruoxqz4g

ruoxqz4g5#

我发现mongo-datatable模块非常容易使用。
为了从MongoDB中检索数据,它要求DataTables的sent-parameters应该是JSON对象的形式,这是express request的查询。
下面是伪代码。(作者here

const MongoDataTable = require('mongo-datatable');
const mongodb = require('mongodb');
const MongoClient = mongodb.MongoClient;

MongoClient.connect('mongodb://localhost/database', function(err, client) {
  const db = client.db('database');
  new MongoDataTable(db).get('collection', options, function(err, result) {
    if (err) {
      // handle the error
    }   
    // result is required output
    // send to client 
    res.json(result);
    // or return a promise in your function
    resolve(result);
  }); 
});

此模块有一些额外的选项(showAlertOnErrorcustomQuerycaseInsensitiveSearch),这些选项是任何实际应用程序开发所必需的。

相关问题