mongo 0.18.2 → 0.18.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. data/README.rdoc +37 -28
  2. data/Rakefile +19 -0
  3. data/bin/objectid_benchmark.rb +23 -0
  4. data/examples/admin.rb +7 -6
  5. data/examples/capped.rb +3 -4
  6. data/examples/cursor.rb +4 -3
  7. data/examples/gridfs.rb +3 -2
  8. data/examples/index_test.rb +10 -9
  9. data/examples/info.rb +3 -2
  10. data/examples/queries.rb +3 -2
  11. data/examples/simple.rb +3 -2
  12. data/examples/strict.rb +2 -1
  13. data/examples/types.rb +4 -3
  14. data/lib/mongo.rb +29 -12
  15. data/lib/mongo/admin.rb +17 -2
  16. data/lib/mongo/collection.rb +230 -169
  17. data/lib/mongo/connection.rb +136 -91
  18. data/lib/mongo/cursor.rb +68 -40
  19. data/lib/mongo/db.rb +247 -123
  20. data/lib/mongo/{errors.rb → exceptions.rb} +6 -5
  21. data/lib/mongo/gridfs.rb +6 -0
  22. data/lib/mongo/gridfs/grid_store.rb +142 -94
  23. data/lib/mongo/types/binary.rb +11 -1
  24. data/lib/mongo/types/code.rb +6 -1
  25. data/lib/mongo/types/dbref.rb +7 -2
  26. data/lib/mongo/types/min_max_keys.rb +58 -0
  27. data/lib/mongo/types/objectid.rb +76 -20
  28. data/lib/mongo/types/regexp_of_holding.rb +5 -0
  29. data/lib/mongo/util/bson_ruby.rb +36 -2
  30. data/lib/mongo/util/byte_buffer.rb +18 -2
  31. data/lib/mongo/util/conversions.rb +6 -5
  32. data/lib/mongo/util/ordered_hash.rb +3 -1
  33. data/lib/mongo/util/support.rb +3 -0
  34. data/lib/mongo/util/xml_to_ruby.rb +7 -0
  35. data/test/test_bson.rb +48 -0
  36. data/test/test_collection.rb +13 -0
  37. data/test/test_connection.rb +35 -0
  38. data/test/test_conversions.rb +1 -1
  39. data/test/test_cursor.rb +37 -5
  40. data/test/test_db.rb +51 -2
  41. data/test/test_db_api.rb +4 -7
  42. data/test/test_grid_store.rb +10 -0
  43. data/test/test_objectid.rb +16 -2
  44. data/test/test_ordered_hash.rb +14 -0
  45. data/test/threading/test_threading_large_pool.rb +4 -4
  46. data/test/unit/db_test.rb +43 -0
  47. metadata +5 -7
  48. data/examples/benchmarks.rb +0 -42
  49. data/examples/blog.rb +0 -76
  50. data/lib/mongo/constants.rb +0 -15
  51. data/test/mongo-qa/_common.rb +0 -8
@@ -2,7 +2,7 @@
2
2
 
3
3
  This is the 10gen-supported Ruby driver for MongoDB[http://www.mongodb.org].
4
4
 
5
- Here is a quick code sample. See the MongoDB Ruby Tutorial
5
+ Here's a quick code sample. See the MongoDB Ruby Tutorial
6
6
  (http://www.mongodb.org/display/DOCS/Ruby+Tutorial) for much more.
7
7
 
8
8
  require 'rubygems'
@@ -56,7 +56,7 @@ That's all there is to it!
56
56
  For extensive examples, see the MongoDB Ruby Tutorial
57
57
  (http://www.mongodb.org/display/DOCS/Ruby+Tutorial).
58
58
 
59
- Bundled with the dirver are many examples in the "examples" subdirectory. Samples include using
59
+ Bundled with the driver are many examples, located in the "examples" subdirectory. Samples include using
60
60
  the driver and using the GridFS class GridStore. MongoDB must be running for
61
61
  these examples to work, of course.
62
62
 
@@ -82,25 +82,34 @@ Note that the GridStore class is not automatically required when you require
82
82
 
83
83
  Example code:
84
84
 
85
- GridStore.open(database, 'filename', 'w') { |f|
85
+ include GridFS
86
+
87
+ # Store the text "Hello, world!" in the grid store.
88
+ GridStore.open(database, 'filename', 'w') do |f|
86
89
  f.puts "Hello, world!"
87
- }
88
- GridStore.open(database, 'filename, 'r') { |f|
89
- puts f.read # => Hello, world!\n
90
- }
91
- GridStore.open(database, 'filename', 'w+') { |f|
90
+ end
91
+
92
+ # Output "Hello, world!"
93
+ GridStore.open(database, 'filename', 'r') do |f|
94
+ puts f.read
95
+ end
96
+
97
+ # Add text to the grid store.
98
+ GridStore.open(database, 'filename', 'w+') do |f|
92
99
  f.puts "But wait, there's more!"
93
- }
94
- GridStore.open(database, 'filename, 'r') { |f|
95
- puts f.read # => Hello, world!\nBut wait, there's more!\n
96
- }
100
+ end
101
+
102
+ # Retrieve everything, outputting "Hello, world!\nBut wait, there's more!\n"
103
+ GridStore.open(database, 'filename', 'r') do |f|
104
+ puts f.read
105
+ end
97
106
 
98
107
 
99
108
  = Notes
100
109
 
101
110
  == Thread Safety
102
111
 
103
- The driver is thread safe.
112
+ The driver is thread-safe.
104
113
 
105
114
  == Connection Pooling
106
115
 
@@ -119,7 +128,7 @@ A pooled connection to a paired instance would look like this:
119
128
  :right => ["db2.example.com", 27017]}, nil,
120
129
  :pool_size => 20, :timeout => 5)
121
130
 
122
- Though the pooling architecure will undoubtedly evolve, it owes much credit
131
+ Though the pooling architecture will undoubtedly evolve, it currently owes much credit
123
132
  to the connection pooling implementations in ActiveRecord and PyMongo.
124
133
 
125
134
  == Using with Phusion Passenger
@@ -139,7 +148,7 @@ or handle reconnecting when passenger forks a new process:
139
148
  end
140
149
  end
141
150
 
142
- The above code should be put in _environment.rb_ or an initialization
151
+ The above code should be put in _environment.rb_ or in an initialization
143
152
  script.
144
153
 
145
154
  See this thread[http://groups.google.com/group/mongodb-user/browse_thread/thread/f31e2d23de38136a]
@@ -156,7 +165,7 @@ read from Mongo will have their character encodings set to UTF-8.
156
165
 
157
166
  When used with Ruby 1.8, the bytes in each string are written to and read from
158
167
  Mongo as-is. If the string is ASCII all is well, because ASCII is a subset of
159
- UTF-8. If the string is not ASCII then it may not be a well-formed UTF-8
168
+ UTF-8. If the string is not ASCII, it may not be a well-formed UTF-8
160
169
  string.
161
170
 
162
171
  == Primary Keys
@@ -173,17 +182,18 @@ generate _id values. If you want to control _id values or even their types,
173
182
  using a PK factory lets you do so.
174
183
 
175
184
  You can tell the Ruby Mongo driver how to create primary keys by passing in
176
- the :pk option to the Connection#db method.
185
+ the :pk_factory option to the Connection#db method.
177
186
 
178
- include Mongo
179
- db = Connection.new.db('dbname', :pk => MyPKFactory.new)
187
+ db = Mongo::Connection.new.db('dbname', :pk_factory => MyPKFactory.new)
180
188
 
181
189
  A primary key factory object must respond to :create_pk, which should take a
182
190
  hash and return a hash which merges the original hash with any primary key
183
- fields the factory wishes to inject. NOTE: if the object already has a primary
184
- key, the factory should not inject a new key; this means that the object is
185
- being used in a repsert but it already exists. The idea here is that whenever
186
- a record is inserted, the :pk object's +create_pk+ method will be called and
191
+ fields the factory wishes to inject.
192
+
193
+ NOTE: if the object already has a primary key, the factory should not inject
194
+ a new key; this means that the object may already exist in the database.
195
+ The idea here is that whenever a record is inserted,
196
+ the :pk_factory object's +create_pk+ method will be called and
187
197
  the new hash returned will be inserted.
188
198
 
189
199
  Here is a sample primary key factory, taken from the tests:
@@ -251,11 +261,10 @@ Random cursor fun facts:
251
261
  - Cursors have a to_a method.
252
262
 
253
263
 
254
-
255
264
  = Testing
256
265
 
257
266
  If you have the source code, you can run the tests. There's a separate rake task for testing with
258
- the mongo_ext c extension enabled.
267
+ the mongo_ext C extension enabled.
259
268
 
260
269
  $ rake test:c
261
270
 
@@ -268,7 +277,7 @@ These will run both unit and functional tests. To run these tests alone:
268
277
  $ rake test:unit
269
278
  $ rake test:functional
270
279
 
271
- To run any individual rake tasks with the C extenson enabled, just pass C_EXT=true to the task:
280
+ To run any individual rake tasks with the C extension enabled, just pass C_EXT=true to the task:
272
281
 
273
282
  $ rake test:unit C_EXT=true
274
283
 
@@ -318,9 +327,9 @@ validator script.
318
327
  This documentation is available online at http://api.mongodb.org/ruby. You can
319
328
  generate the documentation if you have the source by typing
320
329
 
321
- $ rake rdoc
330
+ $ rake ydoc
322
331
 
323
- Then open the file html/index.html.
332
+ Then open the file +ydoc/index.html+.
324
333
 
325
334
 
326
335
  = Release Notes
data/Rakefile CHANGED
@@ -28,6 +28,7 @@ namespace :test do
28
28
  Rake::Task['test:unit'].invoke
29
29
  Rake::Task['test:functional'].invoke
30
30
  Rake::Task['test:pooled_threading'].invoke
31
+ Rake::Task['test:drop_databases'].invoke
31
32
  ENV['C_EXT'] = nil
32
33
  end
33
34
 
@@ -37,6 +38,7 @@ namespace :test do
37
38
  Rake::Task['test:unit'].invoke
38
39
  Rake::Task['test:functional'].invoke
39
40
  Rake::Task['test:pooled_threading'].invoke
41
+ Rake::Task['test:drop_databases'].invoke
40
42
  end
41
43
 
42
44
  Rake::TestTask.new(:unit) do |t|
@@ -73,6 +75,15 @@ namespace :test do
73
75
  t.test_files = FileList['test/replica/query_test.rb']
74
76
  t.verbose = true
75
77
  end
78
+
79
+ task :drop_databases do |t|
80
+ puts "Dropping test database..."
81
+ require File.join(File.dirname(__FILE__), 'lib', 'mongo')
82
+ include Mongo
83
+ con = Connection.new(ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost',
84
+ ENV['MONGO_RUBY_DRIVER_PORT'] || Connection::DEFAULT_PORT)
85
+ con.drop_database('ruby-mongo-test')
86
+ end
76
87
  end
77
88
 
78
89
  desc "Generate documentation"
@@ -83,6 +94,14 @@ task :rdoc do
83
94
  system "rdoc --main README.rdoc --op #{out} --inline-source --quiet README.rdoc `find lib -name '*.rb'`"
84
95
  end
85
96
 
97
+ desc "Generate YARD documentation"
98
+ task :ydoc do
99
+ version = eval(File.read("mongo-ruby-driver.gemspec")).version
100
+ out = File.join('ydoc', version.to_s)
101
+ FileUtils.rm_rf('ydoc')
102
+ system "yardoc lib/**/*.rb lib/mongo/**/*.rb -o #{out} --title MongoRuby-#{version}"
103
+ end
104
+
86
105
  desc "Publish documentation to mongo.rubyforge.org"
87
106
  task :publish => [:rdoc] do
88
107
  # Assumes docs are in ./html
@@ -0,0 +1,23 @@
1
+ require 'rubygems'
2
+ require 'mongo'
3
+ require 'benchmark'
4
+
5
+ TRIALS = 500000
6
+
7
+ include Mongo
8
+
9
+ Benchmark.bm do |x|
10
+
11
+ x.report('original') do
12
+ TRIALS.times do
13
+ ObjectID.new(nil, true)
14
+ end
15
+ end
16
+
17
+ x.report('new') do
18
+ TRIALS.times do
19
+ ObjectID.new(nil, false)
20
+ end
21
+ end
22
+
23
+ end
@@ -1,4 +1,5 @@
1
- $LOAD_PATH[0,0] = File.join(File.dirname(__FILE__), '..', 'lib')
1
+ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+
2
3
  require 'mongo'
3
4
  require 'pp'
4
5
 
@@ -8,16 +9,16 @@ host = ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost'
8
9
  port = ENV['MONGO_RUBY_DRIVER_PORT'] || Connection::DEFAULT_PORT
9
10
 
10
11
  puts "Connecting to #{host}:#{port}"
11
- db = Connection.new(host, port).db('ruby-mongo-examples')
12
+ db = Mongo::Connection.new(host, port).db('ruby-mongo-examples')
12
13
  coll = db.create_collection('test')
13
14
 
14
15
  # Erase all records from collection, if any
15
- coll.clear
16
+ coll.remove
16
17
 
17
18
  admin = db.admin
18
19
 
19
20
  # Profiling level set/get
20
- p admin.profiling_level
21
+ puts "Profiling level: #{admin.profiling_level}"
21
22
 
22
23
  # Start profiling everything
23
24
  admin.profiling_level = :all
@@ -31,8 +32,8 @@ admin.profiling_level = :off
31
32
  # Print all profiling info
32
33
  pp admin.profiling_info
33
34
 
34
- # Validate returns a hash if all is well or raises an exception if there is a
35
- # problem.
35
+ # Validate returns a hash if all is well and
36
+ # raises an exception if there is a problem.
36
37
  info = admin.validate_collection(coll.name)
37
38
  puts "valid = #{info['ok']}"
38
39
  puts info['result']
@@ -1,4 +1,4 @@
1
- $LOAD_PATH[0,0] = File.join(File.dirname(__FILE__), '..', 'lib')
1
+ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
  require 'mongo'
3
3
 
4
4
  include Mongo
@@ -10,9 +10,8 @@ puts "Connecting to #{host}:#{port}"
10
10
  db = Connection.new(host, port).db('ruby-mongo-examples')
11
11
  db.drop_collection('test')
12
12
 
13
- # A capped collection has a max size and optionally a max number of records.
14
- # Old records get pushed out by new ones once the size or max num records is
15
- # reached.
13
+ # A capped collection has a max size and, optionally, a max number of records.
14
+ # Old records get pushed out by new ones once the size or max num records is reached.
16
15
  coll = db.create_collection('test', :capped => true, :size => 1024, :max => 12)
17
16
 
18
17
  100.times { |i| coll.insert('a' => i+1) }
@@ -1,4 +1,5 @@
1
- $LOAD_PATH[0,0] = File.join(File.dirname(__FILE__), '..', 'lib')
1
+ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+
2
3
  require 'mongo'
3
4
  require 'pp'
4
5
 
@@ -12,7 +13,7 @@ db = Connection.new(host, port).db('ruby-mongo-examples')
12
13
  coll = db.collection('test')
13
14
 
14
15
  # Erase all records from collection, if any
15
- coll.clear
16
+ coll.remove
16
17
 
17
18
  # Insert 3 records
18
19
  3.times { |i| coll.insert({'a' => i+1}) }
@@ -23,7 +24,7 @@ coll.clear
23
24
  # Find returns a Cursor, which is Enumerable. You can iterate:
24
25
  coll.find().each { |row| pp row }
25
26
 
26
- # You can turn it into an array
27
+ # You can turn it into an array:
27
28
  array = coll.find().to_a
28
29
 
29
30
  # You can iterate after turning it into an array (the cursor will iterate over
@@ -1,4 +1,5 @@
1
- $LOAD_PATH[0,0] = File.join(File.dirname(__FILE__), '..', 'lib')
1
+ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+
2
3
  require 'mongo'
3
4
  require 'mongo/gridfs'
4
5
 
@@ -19,7 +20,7 @@ end
19
20
  GridStore.open(db, 'foobar', 'w') { |f| f.write("hello, world!") }
20
21
 
21
22
  # Read it and print out the contents
22
- dump(db, 'foobar') # defined above
23
+ dump(db, 'foobar')
23
24
 
24
25
  # Append more data
25
26
  GridStore.open(db, 'foobar', 'w+') { |f| f.write("\n"); f.puts "line two" }
@@ -1,10 +1,5 @@
1
- class Exception
2
- def errmsg
3
- "%s: %s\n%s" % [self.class, message, (backtrace || []).join("\n") << "\n"]
4
- end
5
- end
1
+ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
2
 
7
- $LOAD_PATH[0,0] = File.join(File.dirname(__FILE__), '..', 'lib')
8
3
  require 'mongo'
9
4
 
10
5
  include Mongo
@@ -15,6 +10,12 @@ port = ENV['MONGO_RUBY_DRIVER_PORT'] || Connection::DEFAULT_PORT
15
10
  puts ">> Connecting to #{host}:#{port}"
16
11
  db = Connection.new(host, port).db('ruby-mongo-index_test')
17
12
 
13
+ class Exception
14
+ def errmsg
15
+ "%s: %s\n%s" % [self.class, message, (backtrace || []).join("\n") << "\n"]
16
+ end
17
+ end
18
+
18
19
  puts ">> Dropping collection test"
19
20
  begin
20
21
  res = db.drop_collection('test')
@@ -43,8 +44,8 @@ coll.insert(arr)
43
44
  puts "inserted"
44
45
 
45
46
  puts ">> Creating index"
46
- res = coll.create_index "all", :_id => 1, :number => 1, :rndm => 1, :msg => 1
47
- # res = coll.create_index "all", '_id' => 1, 'number' => 1, 'rndm' => 1, 'msg' => 1
47
+ #res = coll.create_index "all", :_id => 1, :number => 1, :rndm => 1, :msg => 1
48
+ res = coll.create_index [[:number, 1], [:rndm, 1], [:msg, 1]]
48
49
  puts "created index: #{res.inspect}"
49
50
  # ============================ Mongo Log ============================
50
51
  # Fri Dec 5 14:45:02 Adding all existing records for ruby-mongo-console.test to new index
@@ -76,7 +77,7 @@ end
76
77
 
77
78
  puts ">> Dropping index"
78
79
  begin
79
- res = coll.drop_index "all_1"
80
+ res = coll.drop_index "number_1_rndm_1_msg_1"
80
81
  puts "dropped : #{res.inspect}"
81
82
  rescue => e
82
83
  puts "Error: #{e.errmsg}"
@@ -1,4 +1,5 @@
1
- $LOAD_PATH[0,0] = File.join(File.dirname(__FILE__), '..', 'lib')
1
+ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+
2
3
  require 'mongo'
3
4
 
4
5
  include Mongo
@@ -11,7 +12,7 @@ db = Connection.new(host, port).db('ruby-mongo-examples')
11
12
  coll = db.collection('test')
12
13
 
13
14
  # Erase all records from collection, if any
14
- coll.clear
15
+ coll.remove
15
16
 
16
17
  # Insert 3 records
17
18
  3.times { |i| coll.insert({'a' => i+1}) }
@@ -1,4 +1,5 @@
1
- $LOAD_PATH[0,0] = File.join(File.dirname(__FILE__), '..', 'lib')
1
+ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+
2
3
  require 'mongo'
3
4
  require 'pp'
4
5
 
@@ -12,7 +13,7 @@ db = Connection.new(host, port).db('ruby-mongo-examples')
12
13
  coll = db.collection('test')
13
14
 
14
15
  # Remove all records, if any
15
- coll.clear
16
+ coll.remove
16
17
 
17
18
  # Insert three records
18
19
  coll.insert('a' => 1)
@@ -1,4 +1,5 @@
1
- $LOAD_PATH[0,0] = File.join(File.dirname(__FILE__), '..', 'lib')
1
+ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+
2
3
  require 'mongo'
3
4
 
4
5
  include Mongo
@@ -11,7 +12,7 @@ db = Connection.new(host, port).db('ruby-mongo-examples')
11
12
  coll = db.collection('test')
12
13
 
13
14
  # Erase all records from collection, if any
14
- coll.clear
15
+ coll.remove
15
16
 
16
17
  # Insert 3 records
17
18
  3.times { |i| coll.insert({'a' => i+1}) }
@@ -1,4 +1,5 @@
1
- $LOAD_PATH[0,0] = File.join(File.dirname(__FILE__), '..', 'lib')
1
+ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+
2
3
  require 'mongo'
3
4
 
4
5
  include Mongo
@@ -1,4 +1,5 @@
1
- $LOAD_PATH[0,0] = File.join(File.dirname(__FILE__), '..', 'lib')
1
+ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+
2
3
  require 'mongo'
3
4
  require 'pp'
4
5
 
@@ -12,7 +13,7 @@ db = Connection.new(host, port).db('ruby-mongo-examples')
12
13
  coll = db.collection('test')
13
14
 
14
15
  # Remove all records, if any
15
- coll.clear
16
+ coll.remove
16
17
 
17
18
  # Insert record with all sorts of values
18
19
  coll.insert('array' => [1, 2, 3],
@@ -32,4 +33,4 @@ coll.insert('array' => [1, 2, 3],
32
33
 
33
34
  pp coll.find().next_document
34
35
 
35
- coll.clear
36
+ coll.remove
@@ -1,10 +1,7 @@
1
1
  $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
 
3
3
  module Mongo
4
- ASCENDING = 1
5
- DESCENDING = -1
6
-
7
- VERSION = "0.18.2"
4
+ VERSION = "0.18.3"
8
5
  end
9
6
 
10
7
  begin
@@ -13,32 +10,52 @@ begin
13
10
  require 'mongo_ext/cbson'
14
11
  raise LoadError unless defined?(CBson::VERSION) && CBson::VERSION == Mongo::VERSION
15
12
  require 'mongo/util/bson_c'
16
- BSON = BSON_C
13
+ BSON = BSON_C
17
14
  rescue LoadError
18
15
  require 'mongo/util/bson_ruby'
19
- BSON = BSON_RUBY
16
+ BSON = BSON_RUBY
20
17
  warn "\n**Notice: C extension not loaded. This is required for optimum MongoDB Ruby driver performance."
21
18
  warn " You can install the extension as follows:\n gem install mongo_ext\n"
22
19
  warn " If you continue to receive this message after installing, make sure that the"
23
20
  warn " mongo_ext gem is in your load path and that the mongo_ext and mongo gems are of the same version.\n"
24
21
  end
25
22
 
23
+ module Mongo
24
+ ASCENDING = 1
25
+ DESCENDING = -1
26
+
27
+ module Constants
28
+ OP_REPLY = 1
29
+ OP_MSG = 1000
30
+ OP_UPDATE = 2001
31
+ OP_INSERT = 2002
32
+ OP_QUERY = 2004
33
+ OP_GET_MORE = 2005
34
+ OP_DELETE = 2006
35
+ OP_KILL_CURSORS = 2007
36
+
37
+ OP_QUERY_SLAVE_OK = 4
38
+ OP_QUERY_NO_CURSOR_TIMEOUT = 16
39
+ end
40
+
41
+ end
42
+
26
43
  require 'mongo/types/binary'
27
44
  require 'mongo/types/code'
28
45
  require 'mongo/types/dbref'
29
46
  require 'mongo/types/objectid'
30
47
  require 'mongo/types/regexp_of_holding'
48
+ require 'mongo/types/min_max_keys'
31
49
 
32
50
  require 'mongo/util/support'
33
51
  require 'mongo/util/conversions'
34
52
  require 'mongo/util/server_version'
35
53
  require 'mongo/util/bson_ruby'
36
54
 
37
- require 'mongo/errors'
38
- require 'mongo/constants'
55
+ require 'mongo/admin'
56
+ require 'mongo/collection'
39
57
  require 'mongo/connection'
40
- require 'mongo/db'
41
58
  require 'mongo/cursor'
42
- require 'mongo/collection'
43
- require 'mongo/admin'
44
-
59
+ require 'mongo/db'
60
+ require 'mongo/exceptions'
61
+ require 'mongo/gridfs'