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

Презентация:



Advertisements
Похожие презентации
Практическое программирование на Java к.ф.-м.н. Козлов Дмитрий Дмитриевич Кафедра АСВК, Лаборатория Вычислительных комплексов.
Advertisements

Mongodb.org NoSQL база данных. Олег Качан Независимый разработчик twitter.com/maximalno.
Test 16 Вопрос 1. class Clazz { { System.out.println("non-static init"); } public static void main(String a[]) { System.out.println("main"); Clazz ob1.
© Luxoft Training 2013 Java Collections API. © Luxoft Training 2013 Collections hierarchy.
Work with databases in Java. JDBC Tutorial for students of universities Author: Dudnik Oxana.
© 2006 Cisco Systems, Inc. All rights reserved. MPLS v MPLS VPN Implementation Configuring Small-Scale Routing Protocols Between PE and CE Routers.
Предметно-ориентированные языки и Lisp как средство их построения Дмитрий Бушенко 30.
Абстрактные типы данных 1. Абстрактная дата Date dt1, dt2; dt1 = new Date(1, Date.MARCH, 2006); dt2 = (Date)dt1.clone(); dt2.add(300); //
Ассоциативные списки Поиск данных происходит не по индексу или положению объекта, а по его ассоциативной связи: public interface Map { // Доступ к объектам.
Work with server by XMLRPC – library in Java For students Author: Dudnik Oxana.
Understanding Record and Table Locking In OpenEdge ® SQL Applications Jeff Owen Principle Software Engineer, OESQL Progress Software Session 132.
Object-Oriented Programme 1 SSD3: Object-Oriented Programming and Design.
PL/SQL Пакеты. Определение Пакет – это объект схемы данных, объединяющий набор типов, объектов и подпрограмм PL/SQL.
1Georgiy KorneevJava Advanced / Новые возможности Java 5 Проблема 1 Метод void dump(Collection c) { for (Iterator i = c.iterator(); i.hasNext(); ) { Object.
PHP как язык программированияPHP как язык программирования.
S12-1 PAT318, Section 12, March 2005 SECTION 12 LISTS.
Running Commands & Getting Help. Running Commands Commands have the following syntax: command options arguments Each item is separated by a space Options.
WinCC Работа и мониторинг Siemens AG All rights reserved.© TC Nbg.-M Date: File: E02OFFe.PPT Catalog: NWINCC Открытость и способность.
2005 Pearson Education, Inc. All rights reserved Object-Oriented Programming: Inheritance.
Объекты в приложении Данные в таблицах Entity Data Model Концептуальная схема Схема хранения данных ОтображениеОтображение.
Транксрипт:

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

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

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

Enter 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

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

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" }

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

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

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

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 ))....

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 ))

Спасибо! Илья Обшадко, ENTARENA Inc.