我们可以做数据表服务器端分页使用mongodb和java



实际上我已经使用数据表进行了客户端分页,但现在由于大量记录在100K左右,需求发生了变化。

我需要实现服务器端分页。

我使用下面的代码

GSP

       $('#data-grid-table').dataTable( {
             "processing" : true,
             "sAjaxSource": dataUrl,
             "serverSide" : true,
             "sPaginationType": "full",
             "iDisplayLength": 25,
             "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
             "scrollX": true,
             "bFilter": false,
             "columnDefs": [ {
                  searchable: false,
                  "orderable": false,
                  className: "view-cell",
                  targets: 0
                }],
            "aaSorting": [[1,'asc']],
            "fnDrawCallback": function( oSettings ) {
                var callBackFlag = $("#hidden-view-flag").val()
                if(callBackFlag=="1"){
                    $("#hidden-view-flag").val("2")
                }
                if(callBackFlag == "2"){
                      $("#hidden-view-flag").val("3")
                }
                if(hideViewColumn){
                    $(".view-cell").hide();
                }
                $('.datasetTable,  tbody').find('tr').each(function(){
                    $(this).find('th:nth-child(1)').removeClass("sorting_asc");
                });

            }
        }); 
控制器

               dbObjArray = new BasicDBObject[2]
                 dbObjArray[0]= cruxLevel
                 dbObjArray[1] = project
                 List<DBObject> pipeline = Arrays.asList(dbObjArray)
                 if (!datasetObject?.isFlat && jsonFor != 'collection-grid') {
                     output= dataSetCollection.aggregate(pipeline)
                 }else{
                 //def skipRecords = params.iDisplayStart
                 //def limitRecords = params.iDisplayLength
                 //println 'params.iDisplayStart' + params.iDisplayStart
                 //println 'params.iDisplayLength' + params.iDisplayLength
                 println 'else-====================='
                 DBObject limit = new BasicDBObject('$limit':10);
                 DBObject skip = new BasicDBObject('$skip':5);
                 isFlatOutput = true;
                 dbObjArray = new BasicDBObject[3]
                 dbObjArray[0]= project
                 dbObjArray[1]= skip
                 dbObjArray[2]= limit
                 List<DBObject> pipeline1 = Arrays.asList(dbObjArray)
                     AggregationOptions aggregationOptions = AggregationOptions.builder()
                     .batchSize(100)
                     .outputMode(AggregationOptions.OutputMode.CURSOR)
                     .allowDiskUse(true)
                     .build();
                      SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
                      Date now = new Date();
                      println 'Start time to fetch -------------------------------------' + sdfDate.format(now)
                      output = dataSetCollection.aggregate(pipeline1,aggregationOptions)
                      Date now1 = new Date();
                      println 'End time to fetch-------------------------------' + sdfDate.format(now1)

                 }  
                 if(isFlatOutput){
                     SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
                     Date now2 = new Date();
                     println 'Start time to retrieve-------------------------------' + sdfDate.format(now2)
                     while(output.hasNext()) {
                         dataList.add(output.next());
                     }
                     Date now3 = new Date();
                     println 'End time to retrieve-------------------------------' + sdfDate.format(now3)
                 }

我不知道如何取limitskip,所以我硬编码了它。

实际结果:显示10个结果,但next被禁用

预期结果:点击next按钮,显示10条结果并获取下10条记录

请告诉我哪里做错了

def skipRecords
def limitRecords
if(params.iDisplayStart == null){
   skipRecords = 0;
}
if(params.iDisplayLength == null){
   limitRecords = 25;
}
def dbObjArrayTotal = new BasicDBObject[1]
dbObjArrayTotal[0]= project
List<DBObject> pipelineTotal = Arrays.asList(dbObjArrayTotal)
AggregationOptions aggregationOptions = AggregationOptions.builder()
                            .batchSize(100)
                            .outputMode(AggregationOptions.OutputMode.CURSOR)
                            .allowDiskUse(true)
                            .build();
def totalCount = dataSetCollection.aggregate(pipelineTotal,aggregationOptions)
totalCount = totalCount.size()
if(limitRecords == -1){
   limitRecords = totalCount
}
DBObject limit = new BasicDBObject('$limit':limitRecords);
DBObject skip = new BasicDBObject('$skip':skipRecords);
dbObjArray = new BasicDBObject[3]                                dbObjArray[0]= project
dbObjArray[1]= skip
dbObjArray[2]= limit
List<DBObject> flatPipeline = Arrays.asList(dbObjArray)
output = dataSetCollection.aggregate(flatPipeline,aggregationOptions)
def serverData = [
    "iTotalRecords" : totalCount,
    "iTotalDisplayRecords" : totalCount,
    "aaData": yourResult]
return serverData;

和以上GSP是正确的使用方式。

最新更新