Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Базы данных - лекция10 - MongoDB (документоориентированная СУБД)

Anton
November 13, 2018

Базы данных - лекция10 - MongoDB (документоориентированная СУБД)

Anton

November 13, 2018
Tweet

More Decks by Anton

Other Decks in Education

Transcript

  1. Модель данных • Классика SQL: схема б/д → таблица →

    колонки → строки • Документоориентированная б/д: база → коллекция → документ
  2. Документ — древовидная структура любого уровня вложенности (схема предварительно не

    определена) • Студент – Имя – Фамилия – адрес – страна – область – город – улица – вуз – название – факультет – кафедра – группа • Студент – Успеваемость – Семестр-1 – Матанализ – курсовая – зачет – История – экзамен – Философия – экзамен – Семестр-2 – Структуры данных – Функциональный анализ – Линейная алгебра – Теория вероятностей
  3. Аргументы • Некоторые вещи просто естесственно представить в виде иерархической

    структуры • Поддержка типов JSON, в том числе, например, массивы • Обновление жесткой реляционной модели — довольно трудоемкая процедура, особенно, после того, как она внедрена (у гибкости тоже есть своя цена) • И т.п
  4. Установить • 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
  5. mongo шелл: интерактивный JavaScript docs.mongodb.com/manual/tutorial/getting-started/ ] mongo > help >

    show dbs > use students-db > show collections • Специально создавать ни базу, ни коллекции не нужно — достаточно выполнить команду добавления данных
  6. Вставка: 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: "Большая садовая"} })
  7. Поиск: 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": /садовая/})
  8. Индексы, полнотекстовый поиск docs.mongodb.com/manual/indexes/ docs.mongodb.com/manual/core/index-text/ • Полнотекстовый поиск без индекса

    — регулярные выражения • Без индекса поиск перебирает ВСЕ документы в коллекции • Для обычных полей поддерживаются разные конфигурации индексов • Для полнотекстового поиска специальный индекс — text • Для одной коллекции можно создать только один индекс text (может включать любые поля) • Ищет отдельные слова внутри предложений, но не части слов • Регистронезависимый поиск — в версиях >= 3.2
  9. Создать индекс text: collection.createIndex + «text» > db.getCollection("students").createIndex( {fname: "text",

    "address.street": "text" }) > db.getCollection("students").createIndex( {"$**": "text"}) > db.getCollection("students").dropIndexes()
  10. 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)
  11. 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"); [...] } });
  12. [...] var students = [ {fname: "Олег", lname: "Газманов", address:

    {city: "Москва", street: "Большая садовая"}}, {fname: "Родион", lname: "Газманов", address: {city: "Москва", street: "Малая садовая"}}, {fname: "Родион", lname: "Раскольников", address: {city: "Петербург", street: "Большая садовая"}} ]; [...] node-mongo-insert.js
  13. [...] 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
  14. 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"); [...] } });
  15. 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(); }); [...]
  16. JSON в стандарте SQL: SQL/JSON • Не слишком старый (обсуждения

    2017-2018 год) • Реализация в PostgreSQL, MySQL, Oracle, MS SQL • Раньше было кто во что горазд, теперь это стандарт • Подробнее разберем позднее (TODO) • Или самостоятельно