From Zero to Mongo, Art.sy Experience w/ MongoDB

Preview:

DESCRIPTION

Talk given at MongoNYC 2012.

Citation preview

歓喜に寄せて

» MongoDB is our only data store

(technically, S3 is our other store)

January 2011

» How do you plan to query your data?

» N-Gram Search https://github.com/artsy/mongoid_fulltext

class Artist

include Mongoid::Document

include Mongoid::FullTextSearch

field :first_name

field :last_name

def name

[first_name, last_name].join(' ')

end

fulltext_search_in :name

end

~ 50 of 850 genes

MongoDB: A Sparse Hash

{

Contemporary : 100,

Computer Art : 20,

Plays With Scale: 80,

Humor : 70,

Nostalgia : 0,

Hairy or Fluffy : 0

}

MongoDB: Inheritance in the Database

{

_type : SoloArtist,

birthday : 1929,

deathday : 1972

}

{

_type : ArtCollective

founded : 1929

}

MongoDB: Cartesian Product

{

id : BSON::ObjectId(…)

color : red,

medium : works-on-paper,

size : small,

price : [0, 12, 48],

}

MongoDB: from LSH to K-Most Similar Graph

{

artwork_id : BSON::ObjectId(…)

neighbors : [[ BSON::ObjectId(…), score ], … ]

}

http://www.mit.edu/~andoni/LSH/

http://www.cs.princeton.edu/cass/papers/www11.pdf

class User

include Mongoid::Document

field :account_created, default: false

has_many :authentications

def account_created?

account_created || authentications.any?

end

end

task :migrate do

User.where({ :account_created.exists => false }).each do |user|

user.update_attributes!({ account_created: user.account_created? })

end

end

Shard?

REST API as little online

processing as

possible as much offline

parallel processing

as possible

iPad

CMS

Web

» Mongoid Collection Snapshot https://github.com/aaw/mongoid_collection_snapshot

as much offline

parallel processing

as possible

Denormalize? https://github.com/logandk/mongoid_denormalize

https://github.com/dzello/mongoid_alize

» Mongoid Cached JSON https://github.com/dblock/mongoid-cached-json

REST API

class Widget

include Mongoid::CachedJson

field :name

has_many :gadgets

json_fields \

:name => { },

:gadgets => {

:type => :reference,

:properties => :public

}

end

Throw Birds?

rpm_contrib 2.1.9

newrelic_rpm 3.3.3

https://github.com/newrelic/rpm_contrib/pull/16

testing models and APIs will save your life

class User

include Mongoid::Document

end

class Admin < User

end

class Representative

include Mongoid::Document

belongs_to :user, inverse_of: :representative

belongs_to :admin , inverse_of: nil

end

• mongoid-history

• carrierwave-mongoid

• mongoid_fulltext

• mongoid_slug

• delayed_job_mongoid

• mongoid_collection_snapshot

• delayed_job_shallow_mongoid

• mongoid-cached-json

Local MongoDB sudo rm /var/lib/mongodb/mongod.lock

Heroku MongoDB small

Heroku MongoDB shared replica set

MongoHQ dedicted replica set

» $15 - $49 per developer / month

» 149$ / month for a Small Replica Set

» $1345 / month for a Large Replica Set

--------

~ 25K$ / year on database hosting

art.sy: http://art.sy

twitter: @dblockdotorg

blog: http://code.dblock.org

email: dblock@dblock.org

slides on slideshare: http://slideshare.net/dblockdotorg