Использование MongoDB / Clojure <ul><li>Москва </li></ul><ul><li>4 марта 2010 г. </li></ul>Илья Обшадко, ENTARENA Inc.
Постановка проблемы March 03, 10 © ENTARENA, Inc. 2 <ul><li>необходимость хранения сложных объектов </li></ul><ul><li>нече...
Традиционное решение March 03, 10 © ENTARENA, Inc. 2 <ul><li>создание реляционной схемы в соответствии с объектной моделью...
Enter MongoDB March 03, 10 © ENTARENA, Inc. 2 <ul><li>документоориентированная база данных </li></ul><ul><li>все объекты х...
MongoDB: объекты March 03, 10 © ENTARENA, Inc. 2 <ul><li>все объекты БД представляют собой объекты JSON (BSON)  </li></ul>...
MongoDB: коллекции March 03, 10 © ENTARENA, Inc. 2 <ul><li>объекты группируются в коллекции /грубый аналог реляционных таб...
MongoDB: JavaScript March 03, 10 © ENTARENA, Inc. 2 <ul><li>вся работа с БД представлена как JavaScript-вызовы </li></ul>$...
MongoDB: построение схемы March 03, 10 © ENTARENA, Inc. 2 <ul><li>business entities в отдельных коллекциях </li></ul><ul><...
Clojure: executive overview March 03, 10 © ENTARENA, Inc. 2 <ul><li>Lisp-образный язык для JVM </li></ul><ul><li>языковые ...
Clojure: интеграция с MongoDB March 03, 10 © ENTARENA, Inc. 2 <ul><li>Java-драйвер предоставляет всю необходимую функциона...
Clojure: MongoDB API March 03, 10 © ENTARENA, Inc. 2 ( defn  mongo-find  ( [ collection query skip limit ] ( let   [ resul...
Clojure: MongoDB API contd. March 03, 10 © ENTARENA, Inc. 2 ( defn  native-to-dbobject  [ data ] ( cond ( map?  data ) ( l...
Спасибо! Илья Обшадко, ENTARENA Inc. [email_address]
Upcoming SlideShare
Loading in …5
×

Mongodb Keynote 20100304 Ilya Obshadko

906 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
906
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
8
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Mongodb Keynote 20100304 Ilya Obshadko

  1. 1. Использование MongoDB / Clojure <ul><li>Москва </li></ul><ul><li>4 марта 2010 г. </li></ul>Илья Обшадко, ENTARENA Inc.
  2. 2. Постановка проблемы March 03, 10 © ENTARENA, Inc. 2 <ul><li>необходимость хранения сложных объектов </li></ul><ul><li>нечеткость исходной схемы данных </li></ul><ul><li>быстрая эволюция функциональных требований </li></ul>
  3. 3. Традиционное решение March 03, 10 © ENTARENA, Inc. 2 <ul><li>создание реляционной схемы в соответствии с объектной моделью </li></ul><ul><li>хранение данных в таблицах </li></ul><ul><li>использование ORM для трансляции между объектным и реляционным представлением </li></ul>
  4. 4. Enter MongoDB March 03, 10 © ENTARENA, Inc. 2 <ul><li>документоориентированная база данных </li></ul><ul><li>все объекты хранятся в своем натуральном виде </li></ul><ul><li>для хранения объектов используются коллекции </li></ul>
  5. 5. MongoDB: объекты March 03, 10 © ENTARENA, Inc. 2 <ul><li>все объекты БД представляют собой объекты JSON (BSON) </li></ul><ul><li>стандартные типы данных: string, int, boolean, double, null, array, object </li></ul><ul><li>дополнительные типы данных: object id, binary data, regexp, code </li></ul>
  6. 6. MongoDB: коллекции March 03, 10 © ENTARENA, Inc. 2 <ul><li>объекты группируются в коллекции /грубый аналог реляционных таблиц/ </li></ul><ul><li>коллекция может содержать любые объекты /schema-free/ </li></ul><ul><li>коллекция может быть проиндексирована по любым полям, в том числе вложенным </li></ul>
  7. 7. MongoDB: JavaScript March 03, 10 © ENTARENA, Inc. 2 <ul><li>вся работа с БД представлена как JavaScript-вызовы </li></ul>$ 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() { &quot;_id&quot; : ObjectId(&quot;4b8eb748230f141638cae177&quot;), &quot;key1&quot; : &quot;value1&quot;, &quot;key2&quot; : [ 1, 2, 3 ] }{ &quot;_id&quot; : ObjectId(&quot;4b8eb74d230f141638cae178&quot;), &quot;key1&quot; : &quot;value2&quot;, &quot;key2&quot; : [ 4, 5, 6 ] } > db.mycoll.ensureIndex({key1: 1}) > db.mycoll.find({key1:'value1'}){ &quot;_id&quot; : ObjectId(&quot;4b8eb748230f141638cae177&quot;), &quot;key1&quot; : &quot;value1&quot;, &quot;key2&quot; : [ 1, 2, 3 ] } > db.mycoll.update({key1:'value2'}, {'$set':{key3:'some other data'}})> db.mycoll.find(){ &quot;_id&quot; : ObjectId(&quot;4b8eb748230f141638cae177&quot;), &quot;key1&quot; : &quot;value1&quot;, &quot;key2&quot; : [ 1, 2, 3 ] }{ &quot;_id&quot; : ObjectId(&quot;4b8eb74d230f141638cae178&quot;), &quot;key1&quot; : &quot;value2&quot;, &quot;key2&quot; : [ 4, 5, 6 ], &quot;key3&quot; : &quot;some other data&quot; }
  8. 8. MongoDB: построение схемы March 03, 10 © ENTARENA, Inc. 2 <ul><li>business entities в отдельных коллекциях </li></ul><ul><li>detailed records внедрены в объекты </li></ul><ul><li>объекты с соотношениями many-to-many - в отдельных коллекциях </li></ul><ul><li>NEVER NEGLECT COMMON SENSE </li></ul>
  9. 9. Clojure: executive overview March 03, 10 © ENTARENA, Inc. 2 <ul><li>Lisp-образный язык для JVM </li></ul><ul><li>языковые типы данных - строка, число, вектор, список, функция, хэш, множество </li></ul><ul><li>прозрачно интегрируется с Java </li></ul><ul><li>хэши можно хранить как элементы коллекций Mongo </li></ul>
  10. 10. Clojure: интеграция с MongoDB March 03, 10 © ENTARENA, Inc. 2 <ul><li>Java-драйвер предоставляет всю необходимую функциональность </li></ul><ul><li>типы данных легко преобразовываются между MongoDB и Clojure </li></ul><ul><li>ленивость дает дополнительный выигрыш </li></ul>
  11. 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 &quot;$keyword&quot; ) ( keyword ( . get dbobject &quot;$keyword&quot; ) ) ( into {} ( map # ( let [[ k v ] % ] ( vector ( keyword k ) ( dbobject-to-native v ) ) ) dbobject ) ) ) :default dbobject ) ) ....
  12. 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. &quot;sets are not supported by MongoDB, use vector&quot; ) ) ( list? data ) ( throw ( IllegalArgumentException. &quot;lists are not supported by MongoDB, use vector&quot; ) ) ( keyword? data ) ( native-to-dbobject { :$keyword ( name data ) } ) ( mongo-oid? data ) ( com.mongodb.ObjectId. ( . substring data ( . length *oid-prefix* ) ) ) :default data ) )
  13. 13. Спасибо! Илья Обшадко, ENTARENA Inc. [email_address]

×