Использование MongoDB / Clojure

Содержание

Слайд 2

Постановка проблемы

March 03, 10 © ENTARENA, Inc.

2

необходимость хранения сложных объектов
нечеткость исходной схемы

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

Слайд 3

Традиционное решение

March 03, 10 © ENTARENA, Inc.

2

создание реляционной схемы в соответствии с

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

Слайд 4

Enter MongoDB

March 03, 10 © ENTARENA, Inc.

2

документоориентированная база данных
все объекты хранятся в

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

Слайд 5

MongoDB: объекты

March 03, 10 © ENTARENA, Inc.

2

все объекты БД представляют собой объекты

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

объекты группируются в коллекции /грубый аналог

MongoDB: коллекции March 03, 10 © ENTARENA, Inc. 2 объекты группируются в
реляционных таблиц/
коллекция может содержать любые объекты /schema-free/
коллекция может быть проиндексирована по любым полям, в том числе вложенным

Слайд 7

MongoDB: JavaScript

March 03, 10 © ENTARENA, Inc.

2

вся работа с БД представлена как

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

MongoDB: построение схемы March 03, 10 © ENTARENA, Inc. 2 business entities
records внедрены в объекты
объекты с соотношениями many-to-many - в отдельных коллекциях
NEVER NEGLECT COMMON SENSE

Слайд 9

Clojure: executive overview

March 03, 10 © ENTARENA, Inc.

2

Lisp-образный язык для JVM
языковые типы

Clojure: executive overview March 03, 10 © ENTARENA, Inc. 2 Lisp-образный язык
данных - строка, число, вектор, список, функция, хэш, множество
прозрачно интегрируется с Java
хэши можно хранить как элементы коллекций Mongo

Слайд 10

Clojure: интеграция с MongoDB

March 03, 10 © ENTARENA, Inc.

2

Java-драйвер предоставляет всю необходимую

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

Clojure: MongoDB API March 03, 10 © ENTARENA, Inc. 2 (defn mongo-find
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

Clojure: MongoDB API contd. March 03, 10 © ENTARENA, Inc. 2 (defn
(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
))
Имя файла: Использование-MongoDB-/-Clojure.pptx
Количество просмотров: 237
Количество скачиваний: 0