Mongodb Keynote 20100304 Ilya Obshadko
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Mongodb Keynote 20100304 Ilya Obshadko

on

  • 1,033 views

 

Statistics

Views

Total Views
1,033
Views on SlideShare
1,032
Embed Views
1

Actions

Likes
1
Downloads
6
Comments
0

1 Embed 1

http://www.slideshare.net 1

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Mongodb Keynote 20100304 Ilya Obshadko Presentation Transcript

  • 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. [email_address]