MongoDB
MongoDB är en blandning av nyckel-värde databas (t.ex. Scalaris), dokumentdatabas (t.ex. CouchDB) och relationsdatabas (t.ex. MySQL).
Den är skriven i C++ och passar bra för realtidsanalys av webbstatistik (sidvisningar, unika besökare, osv), Sessionsobjekt, Datacachning och mycket mer.
Den har inbyggd replikering, automatisk failover och sharding, hög prestanda och den är open source.
Internt så sparas datan i formatet BSON, vilket är JSON med ett datumformat och möjlighet att spara binärdata.
Installation
Jag kommer som vanligt att använda Mac OS X och Ruby men det finns förkompilerade paket för de vanligaste operativsystemen:
- OS X 32 bit
- OS X 64 bit
- Linux 32 bit
- Linux 64 bit
- Windows 32 bit
- Solaris i86pc (EXPERIMENTAL)
Det finns även bindningar till ett flertal olika språk, dock har jag inte sett någon för .NET
Installationen var helt smärtfri, bara att ladda ner senaste tarbollen (mongodb-osx-x86_64-0.9.5) och packa upp den på valfri plats.
Man behöver skapa en datakatalog (standard är /data/db
) och sen starta servern med
./mongod --dbpath [DATAKATALOGEN]
Nu lyssnar databasen på port 27017
och det finns ett webbgränssnitt på port 28017
.
På Rubysidan behövde jag bara installera paketet mongodb-mongo
från GitHub med RubyGems:
sudo gem install mongodb-mongo
Dags för lite kod
Att ansluta till databasen:
#!/usr/bin/env ruby
require 'rubygems'
require 'mongo'
db = XGen::Mongo::Driver::Mongo.new.db("mydb")
MongoDB har konceptet collections
för likartade dokument. (Eller olikartade.. det bestämmer du helt själv) Man kan likna dem vid tabeller.
# Hämtar en collection, den skapas om den inte redan finns
coll = db.collection("testCollection")
# Man kan stoppa in olika sorters dokument
coll.insert({ :name => "Peter", :address => { :city => "Stockholm" } })
coll.insert({ :name => "Velociraptor", :top_speed => "25 m/s",
:can => {
:open_doors => true,
:turn_at_any_angle_at_any_velocity => true
}
})
# Man kan sedan hämta ut datat ur databasen med metoden find_first.
peter = coll.find_first(:name => 'Peter')
raptor = coll.find_first(:top_speed => '25 m/s')
# Man kan även hämta alla dokument i en collection
coll.find.each do |doc|
puts doc.inspect
end
Vidare läsning
Jag har bara skrapat lite lätt på ytan av allt som går att göra med MongoDB, om du tycker att det verkar intressant så rekomenderar jag följande länkar:
- MongoDB - Ruby document store that doesn’t rhyme with ouch (Presentation av Wynn Netherland)
- MongoDB (Wiki)
- BSON-formatet (Wikipedia)
- @mongodb (Twitter)
- 10gen (Företaget som sponsrar utvecklingen)
- Solution to XKCD Velociraptors Problem #2
// Peter