Использование MongoDB / Clojure презентация

Постановка проблемы March 03, 10 © ENTARENA, Inc. 2 необходимость хранения сложных объектов нечеткость исходной схемы данных быстрая эволюция функциональных требований

Слайд 1
Использование MongoDB / Clojure
Москва
4 марта 2010 г.
Илья Обшадко, ENTARENA Inc.


Слайд 2
Постановка проблемы
March 03, 10 © ENTARENA, Inc.
2
необходимость хранения сложных объектов
нечеткость исходной

схемы данных
быстрая эволюция функциональных требований

Слайд 3
Традиционное решение
March 03, 10 © ENTARENA, Inc.
2
создание реляционной схемы в соответствии

с объектной моделью
хранение данных в таблицах
использование ORM для трансляции между объектным и реляционным представлением

Слайд 4
Enter MongoDB
March 03, 10 © ENTARENA, Inc.
2
документоориентированная база данных
все объекты хранятся

в своем натуральном виде
для хранения объектов используются коллекции

Слайд 5
MongoDB: объекты
March 03, 10 © ENTARENA, Inc.
2
все объекты БД представляют собой

объекты JSON (BSON)
стандартные типы данных: string, int, boolean, double, null, array, object
дополнительные типы данных: object id, binary data, regexp, code

Слайд 6
MongoDB: коллекции
March 03, 10 © ENTARENA, Inc.
2
объекты группируются в коллекции /грубый

аналог реляционных таблиц/
коллекция может содержать любые объекты /schema-free/
коллекция может быть проиндексирована по любым полям, в том числе вложенным

Слайд 7
MongoDB: JavaScript
March 03, 10 © ENTARENA, Inc.
2
вся работа с БД представлена

как JavaScript-вызовы

$ bin/mongo
> use mydb
> record1 = { key1: ‘value1’, key2: [1, 2, 3] }
> record2 = { key1: ‘value2’, key2: [4, 5, 6] }
> db.mycoll.save ( record1 )
> db.mycoll.save ( record2 )
> db.mycoll.find()
{ "_id" : ObjectId("4b8eb748230f141638cae177"), "key1" : "value1", "key2" : [ 1, 2, 3 ] }{ "_id" : ObjectId("4b8eb74d230f141638cae178"), "key1" : "value2", "key2" : [ 4, 5, 6 ] }
> db.mycoll.ensureIndex({key1: 1})
> db.mycoll.find({key1:'value1'}){ "_id" : ObjectId("4b8eb748230f141638cae177"), "key1" : "value1", "key2" : [ 1, 2, 3 ] }
> db.mycoll.update({key1:'value2'}, {'$set':{key3:'some other data'}})> db.mycoll.find(){ "_id" : ObjectId("4b8eb748230f141638cae177"), "key1" : "value1", "key2" : [ 1, 2, 3 ] }{ "_id" : ObjectId("4b8eb74d230f141638cae178"), "key1" : "value2", "key2" : [ 4, 5, 6 ], "key3" : "some other data" }


Слайд 8
MongoDB: построение схемы
March 03, 10 © ENTARENA, Inc.
2
business entities в отдельных

коллекциях
detailed records внедрены в объекты
объекты с соотношениями many-to-many - в отдельных коллекциях
NEVER NEGLECT COMMON SENSE

Слайд 9
Clojure: executive overview
March 03, 10 © ENTARENA, Inc.
2
Lisp-образный язык для JVM
языковые

типы данных - строка, число, вектор, список, функция, хэш, множество
прозрачно интегрируется с Java
хэши можно хранить как элементы коллекций Mongo

Слайд 10
Clojure: интеграция с MongoDB
March 03, 10 © ENTARENA, Inc.
2
Java-драйвер предоставляет всю

необходимую функциональность
типы данных легко преобразовываются между MongoDB и Clojure
ленивость дает дополнительный выигрыш

Слайд 11
Clojure: MongoDB API
March 03, 10 © ENTARENA, Inc.
2
(defn mongo-find
([collection query

skip limit]
(let
[result (.find collection (native-to-dbobject query))
result (if skip (.skip result skip) result)
result (if limit (.limit result limit) result)]
(map dbobject-to-native
(iterator-seq (.iterator result)))))
....
(defn dbobject-to-native [dbobject]
(cond
(instance? java.util.List dbobject)
(into [] (map dbobject-to-native dbobject))

(instance? com.mongodb.ObjectId dbobject)
(str *oid-prefix* (.toString dbobject))

(instance? com.mongodb.DBObject dbobject)
(if (.get dbobject "$keyword")
(keyword (.get dbobject "$keyword"))
(into {}
(map #(let [[k v] %] (vector (keyword k) (dbobject-to-native v))) dbobject)))

:default
dbobject
))
....

Слайд 12
Clojure: MongoDB API contd.
March 03, 10 © ENTARENA, Inc.
2
(defn native-to-dbobject [data]

(cond
(map? data)
(let [result (BasicDBObject.)]
(doseq [[k v] data]
(.put result (if (keyword? k) (name k) (str k))
(native-to-dbobject v)))
result)

(vector? data)
(collection-to-dbobject data)

(set? data)
(throw (IllegalArgumentException. "sets are not supported by MongoDB, use vector"))

(list? data)
(throw (IllegalArgumentException. "lists are not supported by MongoDB, use vector"))

(keyword? data)
(native-to-dbobject {:$keyword (name data)})

(mongo-oid? data)
(com.mongodb.ObjectId. (.substring data (.length *oid-prefix*)))

:default
data
))

Слайд 13
Спасибо! Илья Обшадко, ENTARENA Inc. ilya.obshadko@entarena.com


Обратная связь

Если не удалось найти и скачать презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое ThePresentation.ru?

Это сайт презентаций, докладов, проектов, шаблонов в формате PowerPoint. Мы помогаем школьникам, студентам, учителям, преподавателям хранить и обмениваться учебными материалами с другими пользователями.


Для правообладателей

Яндекс.Метрика