mongodb.org NoSQL база данных
Олег Качан Независимый разработчик twitter.com/maximalno
NoSQL = Not only SQL
NoSQL базы данных Key-value (Redis, Dynamo, MemcacheDB, Voldemort) Document (MongoDB, CouchDB, Riak) Wide Column (BigTable, Cassandra, HBase) Graph (Neo4j, InfiniteGraph)
MongoDB Быстрая база данных (C++) Устоявшийся проект, выпущена версия 2.0 Open-source, но разрабатывается и поддерживается компанией 10gen Одно из наиболее универсальных решений
Поддержка MongoDB языками C/C++ Java.NET Javascript Perl PHP Python Ruby Официальные драйверы Erlang Scala Haskell Драйверы open-source ActionScript, Clojure, Delphi, Node.js, F#, Go, Groovy, Lua, Objective C, Smalltalk и т.д.
Кто использует MongoDB? Craigslist
Кто использует MongoDB?
@hipsterhacker If it's not MongoDB, it's the WrongoDB Retweeted and 100+ others
MongoDB Документная база данных
Каждому ключу соответствует документ { first_name: Oleg, last_name: Kachan, contacts: { twitter: maximalno, }, skills: [php, node.js, mongodb] } _id: ObjectId(4daf…) =>
Организация данных SQLMongoDB База данных ТаблицаКоллекция Строка/записьДокумент
Измение мышление Нет JOIN Избыточность данных вместо нормализации Контроль данных из приложения, а не из базы Навыки работы с SQL базами не подходят для NoSQL
MongoDB Чем лучше?
Сравнение с другими решениями Функциональность Производительность Memcached Key/value MongoDB RDBMS
Преимущества Документно-ориентированная база данных Быстрое чтение и особенно запись Широкая по сравнению с другими NoSQL функциональсть Масштабирование из коробки По чтению (Master/slave, Replica sets) По записи (Sharding)
Но зачем? Области применения
MongoDB Не подходит: если вы используете JOINы если вам необходимы транзакции Подходит: хранение разнородных данных хранение геоданных хранение логов и статистики
Пример HTML-страница Новость Карточка товара Система управления контентом
Пример Система управления контентом SQL 3 таблицы: pages, news, goods MongoDB 1 коллекция: documents
Пример Система управления контентом Страница { type: page, content: Текст на странице }
Пример Система управления контентом Новость { type: news, date: new Date(), header: Заголовок, teaser: Краткий текст, content: Полное содержание }
Пример Система управления контентом Карточка товара { type: good, name: Телевизор price: 30000, features: { lcd: 1, led: 0 }, categories: [ home, tv ] }
MongoDB Подробнее
Организация данных
Типы данных BSON String Integer Double Date Byte array (бинарные данные) Boolean Null BSON Object
Ключ Каждому добавленному документу автоматически предоставляется уникальный ключ _id: ObjectId(47cc e3d95369d)
CRUD
Create SQL CREATE DATABASE vldc; CREATE TABLE vldc.users (`id` INT AUTO_INCREMENT PRIMARY KEY, `first_name` VARCHAR(50), `last_name` VARCHAR(50)); INSERT INTO vldc.users SET first_name = Oleg; MongoDB use vldc db.users.insert({ first_name: Oleg })
Read SQL SELECT * FROM users SELECT first_name FROM users MongoDB db.users.find() db.users.find({}, { first_name: 1 })
Read SQL SELECT * FROM users WHERE first_name = Oleg ORDER BY id DESC LIMIT 1,10 MongoDB db.users.find({first_name: Oleg }).sort({ _id: -1 }).skip(1).limit(10)
Операторы условий $gt, $lt, $gte, $lte $ne $in, $nin $mod $all $size $exists $type $not $where
Update SQL UPDATE users SET last_name = Kachan WHERE first_name= Oleg MongoDB db.users.update({ first_name: Oleg }, { last_name: Kachan }) db.users.update({ first_name: Oleg }, { $set: { last_name: Kachan } })
Операторы модификации $set $unset $inc $push $pushAll $addToSet $pop $pull $pullAll
Delete SQL DELETE FROM users WHERE id = 1 DELETE FROM users WHERE first_name = Oleg MongoDB db.users.remove({ _id: ObjectId(4df8fb81ed4cadd6271c0000) }) db.users.remove({ first_name: Oleg})
Создание индексов SQL ALTER TABLE `users` ADD INDEX (`first_name`) MongoDB db.users.ensureIndex({ first_name: 1 }) // по возрастанию db.users.ensureIndex({ first_name: -1 }) // по убыванию
Гео-индекс MongoDB db.places.ensureIndex({ location: 2d } Поиск при помощи операторов $near – поиск объектов с сортировкой, самые близкие - первые $box – поиск объектов в заданном квадрате $center – поиск объектов в заданном радиусе
Спасибо! Ответы на вопросы