MongoDB приема и предоставя достъп до данни във формата на Javascript Object Notation (JSON), което го прави идеално при работа с базирани на JavaScript услуги за прехвърляне на репрезентативно състояние (REST). В тази публикация ще разгледаме Pagination с помощта на MongoDB и ще изградим просто приложение Express/Mongojs с помощта на slush-mongo. След това ще използваме skip() и limit() за да извлечете необходимите записи от набор от данни.
Пагинацията е един от най-простите начини за увеличаване на UX при работа със средни до огромни набори от данни.
- Разделете всички данни на x записа на страница за да получите (общо записи/x) страници.
- След това показваме пагинация с броя на страниците.
- Тъй като потребителят щракне върху номера на страницата, ние търсим и извличаме набора от записи само за този конкретен изглед.

Можете да намерите демонстрация на живо на приложението тук и пълния код за това приложение тук.
Настройте проекта за пагинация
Създайте нова папка с име mongoDBPagination. Отворете терминал/подкана тук. След това ще инсталираме gulp , киша и киша-монго модули. Пусни:
$ [sudo] npm i -g gulp slush slush-mongo
След като това стане, стартирайте:
$ slush mongo
Ще ви бъдат зададени няколко въпроса и можете да им отговорите по следния начин:
[?] Which MongoDB project would you like to generate? Mongojs/Express [?] What is the name of your app? mongoDBPagination [?] Database Name: myDb [?] Database Host: localhost [?] Database User: [?] Database Password: [?] Database Port: 27017 [?] Will you be using heroku? (Y/n) n
Това ще създаде едно просто приложение Express/Mongojs за нас. След като инсталацията приключи, изпълнете:
$ gulp
След това отворете https://localhost:3000 в любимия си браузър и трябва да видите таблица със списък с маршрути, конфигурирани в приложението. Това потвърждава, че сте инсталирали всичко правилно.
Настройте тестова база данни
След това ще създадем нова колекция с име „testData “ и след това попълнете някои тестови данни в него. След това ще покажем тези данни в таблица с страници. Отворете нов терминал/подкана и стартирайте:
$ mongo
След това изберете вашата база данни, като изпълните:
use myDb
След това копирайте фрагмента по-долу и го поставете в mongo shell и натиснете return:
for(var i = 1; i <= 999; i++) {
db.testData.insert({
name: Math.random()
.toString(36)
.substring(7),
age: Math.floor(Math.random() * 99),
random: Math.random()
.toString(36)
.substring(7)
});
}
Това ще генерира 999 примерни записа с някои произволни данни. Примерен запис ще изглежда така:
{
"_id":"5392a63c90ad2574612b953b",
"name": "j3oasl40a4i",
"age": 73,
"random": "vm2pk1sv2t9"
}
Тези данни ще бъдат разделени на страници в нашето приложение.
Конфигуриране на базата данни
Тъй като добавихме нова колекция, трябва да актуализираме конфигурацията на Mongojs DB, за да четем от „testData ‘.
Отворете mongoDBPagination/config/db.js и актуализирайте ред 17 от:
var db = mongojs(uristring, ['posts']);
до:
var db = mongojs(uristring, ['posts', 'testData']);
Създайте крайната точка на пагинация
Сега ще изградим нашия сървърен код, като създадем крайна точка REST, където клиентът ще ни уведоми какви данни иска.
Логика на пагинация
Логиката за пагинация е доста проста. Нашата колекция от база данни се състои от записи и ние искаме да извлечем и покажем само няколко в даден екземпляр. Това е по-скоро UX нещо, за да поддържате времето за зареждане на страницата до минимум. Ключовите параметри за всеки код за пагинация ще бъдат:
-
Общо записи
Общият брой записи в DB.
-
Размер
Размерът на всеки набор от записи, който клиентът иска да покаже.
-
Страница
Страницата, за която трябва да бъдат извлечени данните.
Да кажем, че клиентът иска 10 записа от първата страница, той ще поиска:
{
page : 1,
size : 10
}
Сървърът ще интерпретира това като – клиентът се нуждае от 10 записа, които започват от индекс 0 (страница:1).
За да получи данните от трета страница, клиентът ще поиска:
{
page : 3,
size : 10
}
Сега сървърът ще интерпретира като – клиентът се нуждае от 10 записа, които започват от индекс 20 (страница – 1 * размер).
И така, разглеждайки горния модел, можем да заключим, че ако стойността на страницата е 1, ще започнем да извличаме данните от запис 0, а ако стойността на страницата е по-голяма от 1, ще започнем да извличаме данни от размера на времето на страницата ( страница*размер).
Поддръжка на MongoDB
Вече имаме разбиране за логиката на пагинация, но как да предадем същото на MongoDB?
MongoDB ни предоставя 2 метода за постигане на това
-
пропускане
След като заявката приключи, MongoDB ще премести курсора до стойността на skip.
-
лимит
След като MongoDB започне да попълва записи, той ще събира само лимита брой записи.
Просто нали? Ще използваме тези два метода заедно с find() за да извлечете записите.
Продължете развитието
Сега нека създадем нов файл с име paginator.js вътре mongoDBPagination/routes папка където ще конфигурираме нашата крайна точка за пагинация. Отворете paginator.js и добавете кода по-долу:
module.exports = function (app) {
var db = require('../config/db')
api = {};
api.testData = function (req, res) {
var page = parseInt(req.query.page),
size = parseInt(req.query.size),
skip = page > 0 ? ((page - 1) * size) : 0;
db.testData.find(null, null, {
skip: skip,
limit: size
}, function (err, data) {
if(err) {
res.json(500, err);
}
else {
res.json({
data: data
});
}
});
};
app.get('/api/testData', api.testData);
};
- Ред 6-7: Получаваме номера на страницата и размера на страницата от параметрите на заявката.
- Ред 8: Конфигурираме пропускането стойност.
- Ред 10: Ние правим заявка към БД, използвайки метода find, като предаваме null като първите 2 аргумента за задоволяване на сигнатурата на метода на find() .
В третия аргумент на метода find ще предадем критерия за филтриране и след като резултатите се върнат, ще отговорим с JSON.
За да тествате това, уверете се, че сървърът ви работи и отидете до:
https://localhost:3000/api/testdata?page=1&size=2
Трябва да видите първите два записа в колекцията и можете да промените стойностите на страницата и размера, за да видите различни резултати.
Изградете клиента
Сега ще изградим клиента, който ще внедри пагинацията с помощта на Bootstrap таблици, за да покаже данните и приставката за стартиране за работа с пейджъра.
Първо, ще инсталираме Bootstrap. Пусни:
$ bower install bootstrap
След това ще изтеглим jquery.bootpag.min.js от тук до public/js папка. Актуализирайте views/index.html като:
<!DOCTYPE html>
<html>
<head>
<title><%= siteName %></title>
<link rel="stylesheet" href="/css/style.css">
<link rel="stylesheet" href="/bower_components/bootstrap/dist/css/bootstrap.min.css">
</head>
<body>
<div class="navbar navbar-inverse navbar-fixed-top" role="navigation">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="javascript:"><%= siteName %></a>
</div>
</div>
</div>
<div class="container">
<h1>My Data</h1>
<table class="table">
<thead>
<tr>
<th>_id</th>
<th>Name</th>
<th>Age</th>
<th>Random</th>
</tr>
</thead>
<tbody>
<!-- we will populate this dyanmically -->
</tbody>
</table>
<div id="pager" class="text-center"></div>
<input type="hidden" value="<%= totalRecords %>" id="totalRecords">
<input type="hidden" value="<%= size %>" id="size">
</div>
<script type="text/javascript" src="bower_components/jquery/dist/jquery.min.js"></script>
<script type="text/javascript" src="/js/jquery.bootpag.min.js"></script>
<script type="text/javascript" src="/js/script.js"></script>
</body>
</html>
И накрая, ще напишем логиката за попълване на таблицата. Отворете js/script.js и го попълнете като:
// init bootpag
$('#pager').bootpag({
total: Math.ceil($("#totalRecords").val()/$("#size").val()),
page : 1,
maxVisible : 10,
href: "#page-{{number}}",
}).on("page", function(event, /* page number here */ num) {
populateTable(num);
});
var template = "<tr><td>_id</td><td>name</td><td>age</td><td>random</td>";
var populateTable = function (page) {
var html = '';
$.getJSON('/api/testdata?page='+page+'&size='+ $("#size").val(), function(data){
data = data.data;
for (var i = 0; i < data.length; i++) {
var d = data[i];
html += template.replace('_id', d._id)
.replace('name', d.name)
.replace('age', d.age)
.replace('random', d.random);
};
$('table tbody').html(html);
});
};
// load first page data
populateTable(1);
Сега отидете до:
https://localhost:3000
Сега трябва да видите таблицата и компонента на пейджъра. Можете да щракнете върху номерата на страниците, за да прегледате данните.
Просто и лесно! Надявам се, че имате идея как да приложите пагинация с помощта на MongoDB.
Можете да намерите кода за това приложение тук.
За повече подробности относно ефективността на операцията за пейджинг вижте другата ни публикация в блога – Бързо пейджиране с MongoDB
Благодаря за четенето. Коментирайте.
@arvindr21