Share
Embed
Transcript
20 slides
-
Модель данных • Классика SQL: схема б/д → таблица →
колонки → строки • Документоориентированная б/д: база → коллекция → документ -
Документ — древовидная структура любого уровня вложенности (схема предварительно не
определена) • Студент – Имя – Фамилия – адрес – страна – область – город – улица – вуз – название – факультет – кафедра – группа • Студент – Успеваемость – Семестр-1 – Матанализ – курсовая – зачет – История – экзамен – Философия – экзамен – Семестр-2 – Структуры данных – Функциональный анализ – Линейная алгебра – Теория вероятностей -
Аргументы • Некоторые вещи просто естесственно представить в виде иерархической
структуры • Поддержка типов JSON, в том числе, например, массивы • Обновление жесткой реляционной модели — довольно трудоемкая процедура, особенно, после того, как она внедрена (у гибкости тоже есть своя цена) • И т.п -
Установить • www.mongodb.com/download-center/community • docs.mongodb.com/manual/tutorial/install-mongodb- on-ubuntu/ • Есть в репозиториях
Ubuntu, но там старая версия 2.6 (не заработает регистронезависимый поиск $text) • Запустить демон mongodb ] /etc/init.d/mongodb start • Запустить командную оболочку mongo -
mongo шелл: интерактивный JavaScript docs.mongodb.com/manual/tutorial/getting-started/ ] mongo > help >
show dbs > use students-db > show collections • Специально создавать ни базу, ни коллекции не нужно — достаточно выполнить команду добавления данных -
Вставка: collection.insert > db.getCollection("students").insert({ fname: "Олег", lname: "Газманов", address: {city:
"Москва", street: "Большая садовая"} }) > db.getCollection("students").insert({ fname: "Родион", lname: "Газманов", address: {city: "Москва", street: "Малая садовая"} }) > db.getCollection("students").insert({ fname: "Родион", lname: "Раскольников", address: {city: "Петербург", street: "Большая садовая"} }) -
Поиск: collection.find > db.getCollection("students").find() > db.getCollection("students").find().count() > db.getCollection("students").find({fname: "Родион"}) >
db.getCollection("students").find({address: {city: "Москва", street: "Малая садовая"}}) > db.getCollection("students").find({"address.city": "Москва"}) > db.getCollection("students").find({"address.street": /садовая/}) -
Индексы, полнотекстовый поиск docs.mongodb.com/manual/indexes/ docs.mongodb.com/manual/core/index-text/ • Полнотекстовый поиск без индекса
— регулярные выражения • Без индекса поиск перебирает ВСЕ документы в коллекции • Для обычных полей поддерживаются разные конфигурации индексов • Для полнотекстового поиска специальный индекс — text • Для одной коллекции можно создать только один индекс text (может включать любые поля) • Ищет отдельные слова внутри предложений, но не части слов • Регистронезависимый поиск — в версиях >= 3.2 -
Создать индекс text: collection.createIndex + «text» > db.getCollection("students").createIndex( {fname: "text",
"address.street": "text" }) > db.getCollection("students").createIndex( {"$**": "text"}) > db.getCollection("students").dropIndexes() -
MongoDB + Node.js • npm install mongodb www.npmjs.com/package/mongodb github.com/mongodb/node-mongodb-native –
почти то же, что mongo shell – в версии >= 3.x сильно поменялось API по сравнению с 2.x • npm install mongoose www.npmjs.com/package/mongoose github.com/Automattic/mongoose • Оба ок, остановимся на mongodb (native) -
node-mongo-insert.js var mongodb = require('mongodb'); var MongoClient = mongodb.MongoClient; //
mongodb version >= 3.1.9 var url = "mongodb://localhost:27017"; MongoClient.connect(url, function (err, client) { if (err) { console.log("Failed to connect: ", err); } else { console.log("Connected to ", url); var db = client.db("students-db"); var collection = db.collection("students"); [...] } }); -
[...] var students = [ {fname: "Олег", lname: "Газманов", address:
{city: "Москва", street: "Большая садовая"}}, {fname: "Родион", lname: "Газманов", address: {city: "Москва", street: "Малая садовая"}}, {fname: "Родион", lname: "Раскольников", address: {city: "Петербург", street: "Большая садовая"}} ]; [...] node-mongo-insert.js -
[...] collection.insertMany(students, function (err, result) { if (err) { console.log(err);
} else { console.log('Inserted: ', result.result.n); } console.log("DONE: close db connection"); client.close(); }); [...] node-mongo-insert.js -
node-mongo.js var mongodb = require('mongodb'); var MongoClient = mongodb.MongoClient; //
mongodb version >= 3.1.9 var url = "mongodb://localhost:27017"; MongoClient.connect(url, function (err, client) { if (err) { console.log("Failed to connect: ", err); } else { console.log("Connected to ", url); var db = client.db("students-db"); var collection = db.collection("students"); [...] } }); -
node-mongo.js [...] //collection.find({fname: "Родион"}).toArray(function (err, result) { //collection.find({"address.street": "Большая садовая"}).toArray(function
(err, result) { //collection.find({"address.street": /садовая/}).toArray(function (err, result) { collection.find({$text: {$search: "садовая"}}).toArray(function (err, result) { if (err) { console.log(err); } else if (result.length > 0) { console.log("Found: " + result.length); for (i = 0; i < result.length; i++) { var stud = result[i]; console.log(stud.fname + " " + stud.lname + ", " + stud.address.city + ", " + stud.address.street); } } else { console.log('Not found'); } console.log("DONE: close db connection"); client.close(); }); [...] -
JSON в стандарте SQL: SQL/JSON • Не слишком старый (обсуждения
2017-2018 год) • Реализация в PostgreSQL, MySQL, Oracle, MS SQL • Раньше было кто во что горазд, теперь это стандарт • Подробнее разберем позднее (TODO) • Или самостоятельно -
Лаба 6 • Перевести лабу 4.2 (динамический фильтр таблицы) на
бэкэнд с хранением данных в MongoDB