際際滷

際際滷Share a Scribd company logo
MongoDB - case study

    Sebastian Nowak


     3 marca 2010
NoSQL

  NoSQL - po co?

      ACID nie zawsze jest potrzebny
      RDBMS nie radz sobie z du甜ym wolumenem danych (TB,
      PB)
      elastyczno
NoSQL

  NoSQL - po co?

      ACID nie zawsze jest potrzebny
      RDBMS nie radz sobie z du甜ym wolumenem danych (TB,
      PB)
      elastyczno


  NoSQL - wady
  Godne zaufania?
NoSQL

    CouchDB
    MongoDB
    Redis
    Neo4j
    Memcachedb
MongoDB - waciwoci

      napisane w C++
MongoDB - waciwoci

      napisane w C++
      dokumenty skaduje jako BSON
MongoDB - waciwoci

      napisane w C++
      dokumenty skaduje jako BSON
      zaprojektowane by pracowa w chmurze
MongoDB - waciwoci

      napisane w C++
      dokumenty skaduje jako BSON
      zaprojektowane by pracowa w chmurze
      UTF-8
MongoDB - waciwoci

      napisane w C++
      dokumenty skaduje jako BSON
      zaprojektowane by pracowa w chmurze
      UTF-8
      protok坦 binarny
MongoDB - waciwoci

      napisane w C++
      dokumenty skaduje jako BSON
      zaprojektowane by pracowa w chmurze
      UTF-8
      protok坦 binarny
      sterowniki do wielu jzyk坦w
MongoDB - waciwoci

      napisane w C++
      dokumenty skaduje jako BSON
      zaprojektowane by pracowa w chmurze
      UTF-8
      protok坦 binarny
      sterowniki do wielu jzyk坦w
      GridFS
MongoDB - waciwoci

      napisane w C++
      dokumenty skaduje jako BSON
      zaprojektowane by pracowa w chmurze
      UTF-8
      protok坦 binarny
      sterowniki do wielu jzyk坦w
      GridFS
      map-reduce, JavaScript
Capped collections

   Idealne do skadowania:
       log坦w
       pr坦bek pomiar坦w (round robin?)
    db.createCollection("books");
   db.createCollection("probes",{capped:true, size:86400});
Insert - save
    doc = { title:"Ruby wzorce projektowe", author:"Russ
   Olsen", tags:["oop","ruby"] };
   db.books.save(doc);
   db.books.save({ title:The Ruby Way, :author:Obie Fernandez,
   tags[ruby]});
Select - 鍖nd
    db.books.findOne();
   db.books.find();
   db.books.find({title:"The Ruby Way"});
   db.books.find({tags:"ruby"});
   db.books.find({}, {title:1});
   db.books.find().skip(10).limit(10);
   db.books.find({tags:{$size: 2}});
   db.books.find({title:/Ruby/});
   db.books.find({author:{$in:["Obie Fernandez", "Russ
   Olsen", "Gabierl Garcia Marquez"]}});
   Inne mody鍖katory: $ne, $in, $nin, $exist, $mod, $all, $size,
   $where
Select - group
    db.books.group({
   key:author:true,
   cond:,
   reduce: function(obj,prev) { prev.count++; },
   initial:{count:0}
   });
界看稼鍖g/糸温岳温恢温壊艶.霞馨鉛

   development:
     database: ratemymodel_development

   test:
     database: ratemymodel_test

   production:
     host:
     port: 9099
     database: ratemymodel_production
initializers/mongodb.rb

   conf = File.read("#{RAILS_ROOT}/config/database.yml")
   db_conf = YAML.load(conf)[RAILS_ENV]
   db_conf["host"] ||= "127.0.0.1"
   db_conf["port"] ||= 27017

   logger = Logger.new("#{RAILS_ROOT}/log/#{RAILS_ENV}_mongodb.log")

   MongoMapper.connection = Mongo::Connection.new(db_conf["host"], db_conf["port"]
     :logger => logger)
   MongoMapper.database = db_conf["database"]
test/test helper.rb

   class ActiveSupport::TestCase
     # Drop all columns after each test case.
     def teardown
       MongoMapper.database.collections.each do |coll|
         coll.remove
       end
     end

     # Make sure that each test case has a teardown
     # method to clear the db after each test.
     def inherited(base)
       base.define_method teardown do
         super
       end
     end
   end
界看稼鍖g/艶稼厩庄姻看稼馨艶稼岳.姻恢

   Rails::Initializer.run do |config|
     config.gem mongo_mapper
     config.gem haml
     config.gem will_paginate
     config.gem hoptoad_notifier
     config.gem carrierwave
     config.gem newrelic_rpm

     config.frameworks -= [:active_record]
     config.metals = ["GridFile"]
   end
app/models/model.rb

  # This class represents a model saved in application.
  class Model
    include MongoMapper::Document
    include MongoMapper::FindRandom

    # Fields definition
    key :name,        String,    :required => true
    key :description, String,    :required => true
    key :tags,        Array
    key :wins,        Integer,   :default => 0
    key :defeats,     Integer,   :default => 0
    key :ratio,       Float,     :default => 0
    key :user_id,     ObjectId

    # Associations
    belongs_to :user
    many :assets, :dependent => :destroy

    # Use created_at and updated_at timestamps
    timestamps!
  end
CarrierWave  kon鍖guracja

   # CarrierWave configuration
   CarrierWave.configure do |config|
     config.grid_fs_database = MongoMapper.database.name
     config.grid_fs_host = MongoMapper.connection.host
     config.grid_fs_access_url = "/images"
   end

   ./script/generate uploader asset
app/uploaders/asset uploader.rb

   class AssetUploader < CarrierWave::Uploader::Base
     include CarrierWave::RMagick

     storage :grid_fs

     def store_dir
       "assets/#{model.id}"
     end

     version :thumb { process :resize_to_fill => [200, 200] }

     version :comparable { process :resize_to_fill => [450,450] }

     def extension_white_list
       %w(jpg jpeg png)
     end
   end
app/models/asset.rb

   # Asset connected with model. It could be photo image etc.
   class Asset
     include MongoMapper::Document
     include MongoMapper::FindRandom

     # Uploader for image
     mount_uploader :image, AssetUploader

     # Fields definition
     key :model_id, ObjectId, :required => true

     # Callbacks
     after_destroy :remove_image_from_db

     # Associations
     belongs_to :model
   end
>>   @asset.image.url
=>   "/images/assets/4b6f009f00090d3b0c000002/10769300.jpg"
>>   @asset.image.comparable.url
=>   "/images/assets/4b6f009f00090d3b0c000002/comparable_10769300.jpg"
>>   @asset.image.thumb.url
=>   "/images/assets/4b6f009f00090d3b0c000002/thumb_10769300.jpg"
app/metals/grid 鍖le.rb

   class GridFile
     def self.call(env)
       if env["PATH_INFO"] =~ /^/images/assets/(.+)$/
         key = "assets/" + $1
         if ::GridFS::GridStore.exist?(MongoMapper.database, key)
           ::GridFS::GridStore.open(MongoMapper.database, key, r) do |file|
             [200, {Content-Type => file.content_type}, [file.read]]
           end
         else
           [404, {Content-Type => text/plain}, [File not found.]]
         end
       else
         [404, {Content-Type => text/plain}, [File not found.]]
       end
     end
   end
http://www.mongodb.org/display/DOCS/Home
http://mongotips.com/
http://github.com/jnunemaker/mongomapper
http://github.com/jnicklas/carrierwave
http://guides.rubyonrails.org/rails on rack.html
http://railstips.org/blog/archives/2009/12/18/why-i-think-
mongo-is-to-databases-what-rails-was-to-frameworks/
http://blog.boxedice.com/2010/02/28/notes-from-a-
production-mongodb-deployment/

More Related Content

What's hot (17)

Aplikacje internetowe real-time w oparciu o React/Redux
Aplikacje internetowe real-time w oparciu o React/ReduxAplikacje internetowe real-time w oparciu o React/Redux
Aplikacje internetowe real-time w oparciu o React/Redux
Dawid Rusnak
ansible kmonticolo bezlogo
ansible kmonticolo bezlogoansible kmonticolo bezlogo
ansible kmonticolo bezlogo
Kamil Monticolo
TorqueBox - Ruby na sterydach
TorqueBox - Ruby na sterydachTorqueBox - Ruby na sterydach
TorqueBox - Ruby na sterydach
marekgoldmann
Jak zosta mobile deweloperem w 1 dzie
Jak zosta mobile deweloperem w 1 dzieJak zosta mobile deweloperem w 1 dzie
Jak zosta mobile deweloperem w 1 dzie
Pawe Kondraciuk
Apache http server - proste i zaawansowane przypadki u甜ycia
Apache http server - proste i zaawansowane przypadki u甜yciaApache http server - proste i zaawansowane przypadki u甜ycia
Apache http server - proste i zaawansowane przypadki u甜ycia
Wojciech Lichota
Budowa element坦w GUI za pomoc biblioteki React - szybki start
Budowa element坦w GUI za pomoc biblioteki React - szybki startBudowa element坦w GUI za pomoc biblioteki React - szybki start
Budowa element坦w GUI za pomoc biblioteki React - szybki start
Sages
GlusterFS
GlusterFSGlusterFS
GlusterFS
ukasz Jagieo
Barcamp 08/06/2010
Barcamp 08/06/2010Barcamp 08/06/2010
Barcamp 08/06/2010
Micha Gruchaa
Zabezpiecz swoj stron w Joomla!
Zabezpiecz swoj stron w Joomla!Zabezpiecz swoj stron w Joomla!
Zabezpiecz swoj stron w Joomla!
Wojciech Klocek
Warsztaty: Podstawy PHP - cze岬sc 2 - omowienie skadni je岬zyka PHP (wersja 7)
Warsztaty: Podstawy PHP - cze岬sc 2 - omowienie skadni je岬zyka PHP (wersja 7)Warsztaty: Podstawy PHP - cze岬sc 2 - omowienie skadni je岬zyka PHP (wersja 7)
Warsztaty: Podstawy PHP - cze岬sc 2 - omowienie skadni je岬zyka PHP (wersja 7)
Codesushi.co (CODESUSHI LLC)
Modularny JavaScript - meet.js
Modularny JavaScript - meet.jsModularny JavaScript - meet.js
Modularny JavaScript - meet.js
Patryk Jar
Thymeleaf - szablony, kt坦re bez przetworzenia zrozumie twoja przegldarka
Thymeleaf - szablony, kt坦re bez przetworzenia zrozumie twoja przegldarkaThymeleaf - szablony, kt坦re bez przetworzenia zrozumie twoja przegldarka
Thymeleaf - szablony, kt坦re bez przetworzenia zrozumie twoja przegldarka
Maciej Ziarko
TorqueBox - moc Javy, pikno Rubiego
TorqueBox - moc Javy, pikno RubiegoTorqueBox - moc Javy, pikno Rubiego
TorqueBox - moc Javy, pikno Rubiego
marekgoldmann
Jak dziaa CPython
Jak dziaa CPythonJak dziaa CPython
Jak dziaa CPython
Wojciech Lichota
Pan Oponka - Biografia
Pan Oponka - BiografiaPan Oponka - Biografia
Pan Oponka - Biografia
Filip Tepper
Podstawy AngularJS
Podstawy AngularJSPodstawy AngularJS
Podstawy AngularJS
Sages
WordUp Tr坦jmiasto - Sage 9 w praktyce
WordUp Tr坦jmiasto - Sage 9 w praktyceWordUp Tr坦jmiasto - Sage 9 w praktyce
WordUp Tr坦jmiasto - Sage 9 w praktyce
Dawid Urbaski
Aplikacje internetowe real-time w oparciu o React/Redux
Aplikacje internetowe real-time w oparciu o React/ReduxAplikacje internetowe real-time w oparciu o React/Redux
Aplikacje internetowe real-time w oparciu o React/Redux
Dawid Rusnak
ansible kmonticolo bezlogo
ansible kmonticolo bezlogoansible kmonticolo bezlogo
ansible kmonticolo bezlogo
Kamil Monticolo
TorqueBox - Ruby na sterydach
TorqueBox - Ruby na sterydachTorqueBox - Ruby na sterydach
TorqueBox - Ruby na sterydach
marekgoldmann
Jak zosta mobile deweloperem w 1 dzie
Jak zosta mobile deweloperem w 1 dzieJak zosta mobile deweloperem w 1 dzie
Jak zosta mobile deweloperem w 1 dzie
Pawe Kondraciuk
Apache http server - proste i zaawansowane przypadki u甜ycia
Apache http server - proste i zaawansowane przypadki u甜yciaApache http server - proste i zaawansowane przypadki u甜ycia
Apache http server - proste i zaawansowane przypadki u甜ycia
Wojciech Lichota
Budowa element坦w GUI za pomoc biblioteki React - szybki start
Budowa element坦w GUI za pomoc biblioteki React - szybki startBudowa element坦w GUI za pomoc biblioteki React - szybki start
Budowa element坦w GUI za pomoc biblioteki React - szybki start
Sages
Barcamp 08/06/2010
Barcamp 08/06/2010Barcamp 08/06/2010
Barcamp 08/06/2010
Micha Gruchaa
Zabezpiecz swoj stron w Joomla!
Zabezpiecz swoj stron w Joomla!Zabezpiecz swoj stron w Joomla!
Zabezpiecz swoj stron w Joomla!
Wojciech Klocek
Warsztaty: Podstawy PHP - cze岬sc 2 - omowienie skadni je岬zyka PHP (wersja 7)
Warsztaty: Podstawy PHP - cze岬sc 2 - omowienie skadni je岬zyka PHP (wersja 7)Warsztaty: Podstawy PHP - cze岬sc 2 - omowienie skadni je岬zyka PHP (wersja 7)
Warsztaty: Podstawy PHP - cze岬sc 2 - omowienie skadni je岬zyka PHP (wersja 7)
Codesushi.co (CODESUSHI LLC)
Modularny JavaScript - meet.js
Modularny JavaScript - meet.jsModularny JavaScript - meet.js
Modularny JavaScript - meet.js
Patryk Jar
Thymeleaf - szablony, kt坦re bez przetworzenia zrozumie twoja przegldarka
Thymeleaf - szablony, kt坦re bez przetworzenia zrozumie twoja przegldarkaThymeleaf - szablony, kt坦re bez przetworzenia zrozumie twoja przegldarka
Thymeleaf - szablony, kt坦re bez przetworzenia zrozumie twoja przegldarka
Maciej Ziarko
TorqueBox - moc Javy, pikno Rubiego
TorqueBox - moc Javy, pikno RubiegoTorqueBox - moc Javy, pikno Rubiego
TorqueBox - moc Javy, pikno Rubiego
marekgoldmann
Pan Oponka - Biografia
Pan Oponka - BiografiaPan Oponka - Biografia
Pan Oponka - Biografia
Filip Tepper
Podstawy AngularJS
Podstawy AngularJSPodstawy AngularJS
Podstawy AngularJS
Sages
WordUp Tr坦jmiasto - Sage 9 w praktyce
WordUp Tr坦jmiasto - Sage 9 w praktyceWordUp Tr坦jmiasto - Sage 9 w praktyce
WordUp Tr坦jmiasto - Sage 9 w praktyce
Dawid Urbaski

Similar to Mongodb with Rails (20)

Micha Dec - Quality in Clouds
Micha Dec - Quality in CloudsMicha Dec - Quality in Clouds
Micha Dec - Quality in Clouds
kraqa
Dziesi serwer坦w poprosz!, czyli co mo甜e Ci zaoferowa definiowanie infra...
Dziesi serwer坦w poprosz!, czyli co mo甜e Ci zaoferowa definiowanie infra...Dziesi serwer坦w poprosz!, czyli co mo甜e Ci zaoferowa definiowanie infra...
Dziesi serwer坦w poprosz!, czyli co mo甜e Ci zaoferowa definiowanie infra...
The Software House
Elasticsearch i Docker - skalowalno, wysoka dostpno i zarzdzanie zasobami
Elasticsearch i Docker - skalowalno, wysoka dostpno i zarzdzanie zasobamiElasticsearch i Docker - skalowalno, wysoka dostpno i zarzdzanie zasobami
Elasticsearch i Docker - skalowalno, wysoka dostpno i zarzdzanie zasobami
Enterprise Search Warsaw Meetup
JavaScript, Moduy
JavaScript, ModuyJavaScript, Moduy
JavaScript, Moduy
Mariusz Nowak
Ganymede - nowoczesne technologie w grach przegldarkowych i mobilnych
Ganymede - nowoczesne technologie w grach przegldarkowych i mobilnychGanymede - nowoczesne technologie w grach przegldarkowych i mobilnych
Ganymede - nowoczesne technologie w grach przegldarkowych i mobilnych
SKN Shader
Deployment kodu z Capistrano
Deployment kodu z CapistranoDeployment kodu z Capistrano
Deployment kodu z Capistrano
Micha Szajbe
Automatyzacja utrzymania jakoci w rodowisku PHP
Automatyzacja utrzymania jakoci w rodowisku PHPAutomatyzacja utrzymania jakoci w rodowisku PHP
Automatyzacja utrzymania jakoci w rodowisku PHP
Laravel Poland MeetUp
Testowanie rozwiza serverless z LocalStack
Testowanie rozwiza serverless z LocalStackTestowanie rozwiza serverless z LocalStack
Testowanie rozwiza serverless z LocalStack
The Software House
Przenie si do kontenera, czyli korzyci z Docker i Docker Compose
Przenie si do kontenera, czyli korzyci z Docker i Docker ComposePrzenie si do kontenera, czyli korzyci z Docker i Docker Compose
Przenie si do kontenera, czyli korzyci z Docker i Docker Compose
Mariusz Bk
DynamoDB podstawy modelowania danych dla opornych
DynamoDB  podstawy modelowania danych dla opornychDynamoDB  podstawy modelowania danych dla opornych
DynamoDB podstawy modelowania danych dla opornych
The Software House
Using Red Gate SQL Doc for database documentation
Using Red Gate SQL Doc for database documentationUsing Red Gate SQL Doc for database documentation
Using Red Gate SQL Doc for database documentation
Mariusz Koprowski
OSGi, deklaratywnie
OSGi, deklaratywnieOSGi, deklaratywnie
OSGi, deklaratywnie
Code-House
MongoDB 2011
MongoDB 2011MongoDB 2011
MongoDB 2011
Natalia Stanko
Jak nad甜y za wiatem front-endu - WordPress Training Day
Jak nad甜y za wiatem front-endu - WordPress Training DayJak nad甜y za wiatem front-endu - WordPress Training Day
Jak nad甜y za wiatem front-endu - WordPress Training Day
Tomasz Dziuda
Pawe Kucharski: Oswajamy Sonia czyli po co nam Hadoop
Pawe Kucharski: Oswajamy Sonia czyli po co nam HadoopPawe Kucharski: Oswajamy Sonia czyli po co nam Hadoop
Pawe Kucharski: Oswajamy Sonia czyli po co nam Hadoop
AnalyticsConf
Aplikacje internetowe (2010)
Aplikacje internetowe (2010)Aplikacje internetowe (2010)
Aplikacje internetowe (2010)
Adrian Kalbarczyk
JSON, REST API
JSON, REST APIJSON, REST API
JSON, REST API
3camp
Platforma Kontentowa
Platforma KontentowaPlatforma Kontentowa
Platforma Kontentowa
Rafa Filipek
AADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScriptAADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScript
Jacek Okrojek
Micha Dec - Quality in Clouds
Micha Dec - Quality in CloudsMicha Dec - Quality in Clouds
Micha Dec - Quality in Clouds
kraqa
Dziesi serwer坦w poprosz!, czyli co mo甜e Ci zaoferowa definiowanie infra...
Dziesi serwer坦w poprosz!, czyli co mo甜e Ci zaoferowa definiowanie infra...Dziesi serwer坦w poprosz!, czyli co mo甜e Ci zaoferowa definiowanie infra...
Dziesi serwer坦w poprosz!, czyli co mo甜e Ci zaoferowa definiowanie infra...
The Software House
Elasticsearch i Docker - skalowalno, wysoka dostpno i zarzdzanie zasobami
Elasticsearch i Docker - skalowalno, wysoka dostpno i zarzdzanie zasobamiElasticsearch i Docker - skalowalno, wysoka dostpno i zarzdzanie zasobami
Elasticsearch i Docker - skalowalno, wysoka dostpno i zarzdzanie zasobami
Enterprise Search Warsaw Meetup
JavaScript, Moduy
JavaScript, ModuyJavaScript, Moduy
JavaScript, Moduy
Mariusz Nowak
Ganymede - nowoczesne technologie w grach przegldarkowych i mobilnych
Ganymede - nowoczesne technologie w grach przegldarkowych i mobilnychGanymede - nowoczesne technologie w grach przegldarkowych i mobilnych
Ganymede - nowoczesne technologie w grach przegldarkowych i mobilnych
SKN Shader
Deployment kodu z Capistrano
Deployment kodu z CapistranoDeployment kodu z Capistrano
Deployment kodu z Capistrano
Micha Szajbe
Automatyzacja utrzymania jakoci w rodowisku PHP
Automatyzacja utrzymania jakoci w rodowisku PHPAutomatyzacja utrzymania jakoci w rodowisku PHP
Automatyzacja utrzymania jakoci w rodowisku PHP
Laravel Poland MeetUp
Testowanie rozwiza serverless z LocalStack
Testowanie rozwiza serverless z LocalStackTestowanie rozwiza serverless z LocalStack
Testowanie rozwiza serverless z LocalStack
The Software House
Przenie si do kontenera, czyli korzyci z Docker i Docker Compose
Przenie si do kontenera, czyli korzyci z Docker i Docker ComposePrzenie si do kontenera, czyli korzyci z Docker i Docker Compose
Przenie si do kontenera, czyli korzyci z Docker i Docker Compose
Mariusz Bk
DynamoDB podstawy modelowania danych dla opornych
DynamoDB  podstawy modelowania danych dla opornychDynamoDB  podstawy modelowania danych dla opornych
DynamoDB podstawy modelowania danych dla opornych
The Software House
Using Red Gate SQL Doc for database documentation
Using Red Gate SQL Doc for database documentationUsing Red Gate SQL Doc for database documentation
Using Red Gate SQL Doc for database documentation
Mariusz Koprowski
OSGi, deklaratywnie
OSGi, deklaratywnieOSGi, deklaratywnie
OSGi, deklaratywnie
Code-House
Jak nad甜y za wiatem front-endu - WordPress Training Day
Jak nad甜y za wiatem front-endu - WordPress Training DayJak nad甜y za wiatem front-endu - WordPress Training Day
Jak nad甜y za wiatem front-endu - WordPress Training Day
Tomasz Dziuda
Pawe Kucharski: Oswajamy Sonia czyli po co nam Hadoop
Pawe Kucharski: Oswajamy Sonia czyli po co nam HadoopPawe Kucharski: Oswajamy Sonia czyli po co nam Hadoop
Pawe Kucharski: Oswajamy Sonia czyli po co nam Hadoop
AnalyticsConf
Aplikacje internetowe (2010)
Aplikacje internetowe (2010)Aplikacje internetowe (2010)
Aplikacje internetowe (2010)
Adrian Kalbarczyk
JSON, REST API
JSON, REST APIJSON, REST API
JSON, REST API
3camp
Platforma Kontentowa
Platforma KontentowaPlatforma Kontentowa
Platforma Kontentowa
Rafa Filipek
AADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScriptAADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScript
Jacek Okrojek

Mongodb with Rails

  • 1. MongoDB - case study Sebastian Nowak 3 marca 2010
  • 2. NoSQL NoSQL - po co? ACID nie zawsze jest potrzebny RDBMS nie radz sobie z du甜ym wolumenem danych (TB, PB) elastyczno
  • 3. NoSQL NoSQL - po co? ACID nie zawsze jest potrzebny RDBMS nie radz sobie z du甜ym wolumenem danych (TB, PB) elastyczno NoSQL - wady Godne zaufania?
  • 4. NoSQL CouchDB MongoDB Redis Neo4j Memcachedb
  • 5. MongoDB - waciwoci napisane w C++
  • 6. MongoDB - waciwoci napisane w C++ dokumenty skaduje jako BSON
  • 7. MongoDB - waciwoci napisane w C++ dokumenty skaduje jako BSON zaprojektowane by pracowa w chmurze
  • 8. MongoDB - waciwoci napisane w C++ dokumenty skaduje jako BSON zaprojektowane by pracowa w chmurze UTF-8
  • 9. MongoDB - waciwoci napisane w C++ dokumenty skaduje jako BSON zaprojektowane by pracowa w chmurze UTF-8 protok坦 binarny
  • 10. MongoDB - waciwoci napisane w C++ dokumenty skaduje jako BSON zaprojektowane by pracowa w chmurze UTF-8 protok坦 binarny sterowniki do wielu jzyk坦w
  • 11. MongoDB - waciwoci napisane w C++ dokumenty skaduje jako BSON zaprojektowane by pracowa w chmurze UTF-8 protok坦 binarny sterowniki do wielu jzyk坦w GridFS
  • 12. MongoDB - waciwoci napisane w C++ dokumenty skaduje jako BSON zaprojektowane by pracowa w chmurze UTF-8 protok坦 binarny sterowniki do wielu jzyk坦w GridFS map-reduce, JavaScript
  • 13. Capped collections Idealne do skadowania: log坦w pr坦bek pomiar坦w (round robin?) db.createCollection("books"); db.createCollection("probes",{capped:true, size:86400});
  • 14. Insert - save doc = { title:"Ruby wzorce projektowe", author:"Russ Olsen", tags:["oop","ruby"] }; db.books.save(doc); db.books.save({ title:The Ruby Way, :author:Obie Fernandez, tags[ruby]});
  • 15. Select - 鍖nd db.books.findOne(); db.books.find(); db.books.find({title:"The Ruby Way"}); db.books.find({tags:"ruby"}); db.books.find({}, {title:1}); db.books.find().skip(10).limit(10); db.books.find({tags:{$size: 2}}); db.books.find({title:/Ruby/}); db.books.find({author:{$in:["Obie Fernandez", "Russ Olsen", "Gabierl Garcia Marquez"]}}); Inne mody鍖katory: $ne, $in, $nin, $exist, $mod, $all, $size, $where
  • 16. Select - group db.books.group({ key:author:true, cond:, reduce: function(obj,prev) { prev.count++; }, initial:{count:0} });
  • 17. 界看稼鍖g/糸温岳温恢温壊艶.霞馨鉛 development: database: ratemymodel_development test: database: ratemymodel_test production: host: port: 9099 database: ratemymodel_production
  • 18. initializers/mongodb.rb conf = File.read("#{RAILS_ROOT}/config/database.yml") db_conf = YAML.load(conf)[RAILS_ENV] db_conf["host"] ||= "127.0.0.1" db_conf["port"] ||= 27017 logger = Logger.new("#{RAILS_ROOT}/log/#{RAILS_ENV}_mongodb.log") MongoMapper.connection = Mongo::Connection.new(db_conf["host"], db_conf["port"] :logger => logger) MongoMapper.database = db_conf["database"]
  • 19. test/test helper.rb class ActiveSupport::TestCase # Drop all columns after each test case. def teardown MongoMapper.database.collections.each do |coll| coll.remove end end # Make sure that each test case has a teardown # method to clear the db after each test. def inherited(base) base.define_method teardown do super end end end
  • 20. 界看稼鍖g/艶稼厩庄姻看稼馨艶稼岳.姻恢 Rails::Initializer.run do |config| config.gem mongo_mapper config.gem haml config.gem will_paginate config.gem hoptoad_notifier config.gem carrierwave config.gem newrelic_rpm config.frameworks -= [:active_record] config.metals = ["GridFile"] end
  • 21. app/models/model.rb # This class represents a model saved in application. class Model include MongoMapper::Document include MongoMapper::FindRandom # Fields definition key :name, String, :required => true key :description, String, :required => true key :tags, Array key :wins, Integer, :default => 0 key :defeats, Integer, :default => 0 key :ratio, Float, :default => 0 key :user_id, ObjectId # Associations belongs_to :user many :assets, :dependent => :destroy # Use created_at and updated_at timestamps timestamps! end
  • 22. CarrierWave kon鍖guracja # CarrierWave configuration CarrierWave.configure do |config| config.grid_fs_database = MongoMapper.database.name config.grid_fs_host = MongoMapper.connection.host config.grid_fs_access_url = "/images" end ./script/generate uploader asset
  • 23. app/uploaders/asset uploader.rb class AssetUploader < CarrierWave::Uploader::Base include CarrierWave::RMagick storage :grid_fs def store_dir "assets/#{model.id}" end version :thumb { process :resize_to_fill => [200, 200] } version :comparable { process :resize_to_fill => [450,450] } def extension_white_list %w(jpg jpeg png) end end
  • 24. app/models/asset.rb # Asset connected with model. It could be photo image etc. class Asset include MongoMapper::Document include MongoMapper::FindRandom # Uploader for image mount_uploader :image, AssetUploader # Fields definition key :model_id, ObjectId, :required => true # Callbacks after_destroy :remove_image_from_db # Associations belongs_to :model end
  • 25. >> @asset.image.url => "/images/assets/4b6f009f00090d3b0c000002/10769300.jpg" >> @asset.image.comparable.url => "/images/assets/4b6f009f00090d3b0c000002/comparable_10769300.jpg" >> @asset.image.thumb.url => "/images/assets/4b6f009f00090d3b0c000002/thumb_10769300.jpg"
  • 26. app/metals/grid 鍖le.rb class GridFile def self.call(env) if env["PATH_INFO"] =~ /^/images/assets/(.+)$/ key = "assets/" + $1 if ::GridFS::GridStore.exist?(MongoMapper.database, key) ::GridFS::GridStore.open(MongoMapper.database, key, r) do |file| [200, {Content-Type => file.content_type}, [file.read]] end else [404, {Content-Type => text/plain}, [File not found.]] end else [404, {Content-Type => text/plain}, [File not found.]] end end end