-
-
Save MChorfa/1103513 to your computer and use it in GitHub Desktop.
Files used in a presentation on MongoDB and Ruby
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'rubygems' | |
require 'mongo' | |
@con = Mongo::Connection.new | |
# Instance of Mongo::DB | |
@db = @con['webinar'] | |
# Instance of Mongo::Collection | |
@col = @db['users'] | |
@doc = { :first => "Kyle", | |
:last => "Banker", | |
:city => "NYC", | |
:loc => [40.1, -73], | |
:status => 0 | |
} | |
id = @col.insert(@doc) | |
@col.update({'_id' => id}) | |
puts "\nCursors and queries" | |
# Instance of Mongo::Cursor | |
@cursor = @col.find | |
# Implements Enumerable | |
@cursor.each do |doc| | |
p doc | |
end | |
# Manual iteration | |
@cursor = @col.find | |
while @cursor.has_next? | |
p @cursor.next_document | |
end | |
# Collection#find_one doesn't create a cursor | |
p @col.find_one | |
puts "\nRunning a command" | |
# BSON::OrderedHash (not needed in 1.9) | |
# Sometimes documents need ordering, as when running commands | |
# The command key must come first | |
@cmd = BSON::OrderedHash.new | |
@cmd['findAndModify'] = 'users' | |
@cmd['query'] = {:first => "Kyle"} | |
@cmd['update'] = {:$set => {:status => 2}} | |
p @db.command(@cmd) | |
@col.remove | |
# Executables | |
# - j2bson | |
# - b2json | |
# - mongo_console |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'rubygems' | |
require 'logger' | |
require 'mongo' | |
# Connecting to a single mongod or to mongos | |
# 'localhost', 27017 | |
Mongo::Connection.new | |
# Host / port parameters | |
Mongo::Connection.new('localhost', 27017) | |
# With logging | |
# Note: this make things slower. Not for high performance apps. | |
@logger = Logger.new('mongo-ruby.log') | |
@con = Mongo::Connection.new('localhost', 27017, :logger => @logger) | |
@con['test']['foo'].save({:foo => "bar"}) | |
# Connection to a secondary or slave node | |
Mongo::Connection.new('localhost', 27017, :slave_ok => true) | |
# Using Mongo URI | |
Mongo::Connection.from_uri("mongo://localhost:27017") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'rubygems' | |
require 'mongo' | |
p BSON::BSON_CODER | |
# Since you can build true, multi-threaded apps, connection pooling | |
# will be most useful here. | |
# pool_size = number of threads, where one thread is allocated per connection. | |
# timeout is the amount of time to wait for a new connection before raising an exception | |
# This works for ReplSetConnection too. | |
Mongo::Connection.new('localhost', 27017, :pool_size => 10, :timeout => 500) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Object mappers | |
# MongoDoc | |
# MongoMatic | |
# Candy | |
# MongoMapper | |
# Mongoid | |
# I recommend MongoMapper. However, lots of works has gone into | |
# the other projects. You should decide based on tests, review of the | |
# code base, successful projects. | |
# Common feautures | |
# - Validation | |
# - Associations (Document-document, Embedded, and Polymorphic) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Rules of thumb | |
# 1. Know your tools. | |
# - MongoDB | |
# - Driver | |
# - Object Mapper (Read the code!) | |
# 2. Don't let abstractions make you weak or lead you astray. | |
# - Documents should be no more than a couple levels deep. | |
# - And generally no larger than 100KB. | |
# - Going against either of the above is a code smell. | |
# 3. Don't declare indexes in your model. | |
# - An index is a migration and therefore should not be built automatically. | |
# - Mongoid has a rake task for build indexes. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'rubygems' | |
require 'mongo' | |
# Note: this assumes a replica set with three nodes on | |
# localhost, starting at 30000 | |
# Basic connection | |
# Note: it's best to specify all seed node in your app | |
Mongo::ReplSetConnection.new( ['localhost', 30000], ['localhost', 30001], | |
['localhost', 30002] ) | |
# Ensure replica set name | |
Mongo::ReplSetConnection.new( ['localhost', 30000], :rs_name => "foo" ) | |
# Distribute reads to secondaries | |
Mongo::ReplSetConnection.new( ['localhost', 30000], :read_secondary => true ) | |
# Connect directly to a secondary node | |
Mongo::Connection.new( ['localhost', 30001], :slave_ok => true ) | |
# Using Mongo URI | |
Mongo::Connection.from_uri("mongo://localhost:30001,localhost:30002") | |
# The failover question. | |
# If a replica set member fails, electing a new master can take | |
# time. Your application has to allow for this. | |
# See tests. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'rubygems' | |
require 'mongo' | |
# Write concern can be set on the Connection, DB, Collection, | |
# or individual operation. Applies to inserts, updates, and deletes. | |
# Writes just write to the socket. Write concen will issue a getlasterror | |
# command immediately after to flush the socket and ensure that no | |
# errors were raised on the server. | |
# You can run getlasterror manually. There's a driver helper. | |
@con = Mongo::Connection.new | |
@db = @con['test'] | |
puts "Get last error" | |
@db['test']['foo'].save({:foo => "baz"}) | |
p @db.get_last_error | |
# Ensure that write was replicated to a total of two nodes, | |
# with a 500ms timeout | |
@db['test']['foo'].save({:foo => "bar"}) | |
@db['test']['foo'].remove | |
p @db.get_last_error(:w => 0, :wtimeout => 500) | |
puts "Safe mode inheritance" | |
# These options are specified using :safe | |
@con = Mongo::Connection.new('localhost', 27017, :safe => true) | |
@db = @con['test'] | |
@col = @db['foo'] | |
p @db.safe | |
p @col.safe | |
# Overriding the default safe setting | |
@col.save({:foo => "baz"}, :safe => false) | |
# More sophisticated safe settings | |
@con = Mongo::Connection.new('localhost', 27017) | |
@analytics = @con['analytics'] | |
@app = Mongo::DB.new('app', @con, :safe => {:w => 2, :wtimout => 500}) | |
puts "Analytics safe mode: #{@analytics.safe}" | |
puts "App safe mode: #{@app.safe.inspect}" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment