mongodb-mongo 0.5.3 → 0.6.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +6 -6
- data/bin/run_test_script +4 -0
- data/bin/standard_benchmark +49 -0
- data/examples/admin.rb +41 -0
- data/examples/benchmarks.rb +6 -2
- data/examples/capped.rb +23 -0
- data/examples/cursor.rb +47 -0
- data/examples/gridfs.rb +87 -0
- data/examples/info.rb +30 -0
- data/examples/queries.rb +69 -0
- data/examples/strict.rb +34 -0
- data/examples/types.rb +40 -0
- data/lib/mongo/collection.rb +10 -2
- data/lib/mongo/cursor.rb +5 -0
- data/lib/mongo/db.rb +2 -0
- data/lib/mongo/gridfs/chunk.rb +0 -2
- data/lib/mongo/gridfs/grid_store.rb +10 -10
- data/lib/mongo/message/query_message.rb +1 -1
- data/lib/mongo/query.rb +1 -0
- data/lib/mongo/types/objectid.rb +2 -2
- data/lib/mongo/util/bson.rb +4 -4
- data/mongo-ruby-driver.gemspec +77 -58
- data/tests/mongo-qa/admin +26 -0
- data/tests/mongo-qa/capped +5 -0
- data/tests/mongo-qa/count1 +8 -0
- data/tests/mongo-qa/dbs +22 -0
- data/tests/mongo-qa/find +4 -0
- data/tests/mongo-qa/find1 +15 -0
- data/tests/mongo-qa/indices +46 -0
- data/tests/mongo-qa/remove +18 -0
- data/tests/mongo-qa/stress1 +35 -0
- data/tests/mongo-qa/test1 +5 -1
- data/tests/mongo-qa/update +18 -0
- data/tests/test_db.rb +2 -2
- data/tests/test_db_api.rb +12 -0
- data/tests/test_objectid.rb +8 -8
- metadata +21 -7
- data/tests/mongo-qa/circular +0 -16
data/README.rdoc
CHANGED
@@ -3,10 +3,6 @@
|
|
3
3
|
This is a Ruby driver for the 10gen Mongo DB. For more information about
|
4
4
|
Mongo, see http://www.mongodb.org.
|
5
5
|
|
6
|
-
Note: this driver is still alpha quality. The API will change, as *may* the
|
7
|
-
data saved to the database (especially primary key values). Do *_not_* use
|
8
|
-
this for any production data yet.
|
9
|
-
|
10
6
|
Start by reading the XGen::Mongo::Driver::Mongo and XGen::Mongo::Driver::DB
|
11
7
|
documentation, then move on to XGen::Mongo::Driver::Collection and
|
12
8
|
XGen::Mongo::Driver::Cursor.
|
@@ -35,7 +31,7 @@ a separate project.
|
|
35
31
|
Install the "mongo" gem by typing
|
36
32
|
|
37
33
|
$ gem sources -a http://gems.github.com
|
38
|
-
$ sudo gem install mongodb-mongo
|
34
|
+
$ sudo gem install mongodb-mongo
|
39
35
|
|
40
36
|
The first line tells RubyGems to add the GitHub gem repository. You only need
|
41
37
|
to run this command once.
|
@@ -49,6 +45,9 @@ you can install it as a gem from the source by typing
|
|
49
45
|
|
50
46
|
$ rake gem:install
|
51
47
|
|
48
|
+
Note: when you install the gem this way it is called "mongo", not
|
49
|
+
"mongodb-mongo". In either case, you "require 'mongo'" in your source code.
|
50
|
+
|
52
51
|
|
53
52
|
= Examples
|
54
53
|
|
@@ -89,7 +88,8 @@ Here is some simple example code:
|
|
89
88
|
|
90
89
|
The GridStore class is a Ruby implementation of Mongo's GridFS file storage
|
91
90
|
system. An instance of GridStore is like an IO object. See the rdocs for
|
92
|
-
details.
|
91
|
+
details, and see examples/gridfs.rb for code that uses many of the GridStore
|
92
|
+
features like metadata, content type, rewind/seek/tell, etc.
|
93
93
|
|
94
94
|
Note that the GridStore class is not automatically required when you require
|
95
95
|
'mongo'. You need to require 'mongo/gridfs'.
|
data/bin/run_test_script
CHANGED
@@ -0,0 +1,49 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Note: Ruby 1.9 is faster than 1.8, as expected.
|
4
|
+
|
5
|
+
$LOAD_PATH[0,0] = File.join(File.dirname(__FILE__), '..', 'lib')
|
6
|
+
require 'mongo'
|
7
|
+
|
8
|
+
include XGen::Mongo::Driver
|
9
|
+
|
10
|
+
N = 30_000
|
11
|
+
|
12
|
+
def report(str, t0, t1, n)
|
13
|
+
dt = t1.to_f - t0.to_f
|
14
|
+
printf("%16s: %03.8f\n", str, dt)
|
15
|
+
end
|
16
|
+
|
17
|
+
def benchmark(str, n, db, after_proc=nil)
|
18
|
+
coll = db.collection('benchmark')
|
19
|
+
t0 = Time.new
|
20
|
+
n.times { |i| yield coll, i }
|
21
|
+
after_proc.call if after_proc
|
22
|
+
report(str, t0, Time.new, n)
|
23
|
+
end
|
24
|
+
|
25
|
+
host = ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost'
|
26
|
+
port = ENV['MONGO_RUBY_DRIVER_PORT'] || XGen::Mongo::Driver::Mongo::DEFAULT_PORT
|
27
|
+
|
28
|
+
db = Mongo.new(host, port).db('ruby-benchmark')
|
29
|
+
db.drop_collection('benchmark')
|
30
|
+
coll = db.collection('benchmark')
|
31
|
+
|
32
|
+
coll.create_index('foo', 'i')
|
33
|
+
|
34
|
+
# Call to db.error forces inserts to finish
|
35
|
+
benchmark('insert', N, db, Proc.new{db.error}) { |coll, i|
|
36
|
+
coll.insert('i' => i)
|
37
|
+
}
|
38
|
+
benchmark('find_first', N, db) { |coll, i|
|
39
|
+
coll.find_first
|
40
|
+
}
|
41
|
+
benchmark('find', N, db) { |coll, i|
|
42
|
+
coll.find('i' => 3).each { }
|
43
|
+
coll.find('i' => 234).each { }
|
44
|
+
coll.find('i' => 9876).each { }
|
45
|
+
}
|
46
|
+
benchmark('find gt/lt', N, db) { |coll, i|
|
47
|
+
h = {'i' => {'$gt' => 200, '$lt' => 200}}
|
48
|
+
coll.find(h).each {}
|
49
|
+
}
|
data/examples/admin.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
$LOAD_PATH[0,0] = File.join(File.dirname(__FILE__), '..', 'lib')
|
2
|
+
require 'mongo'
|
3
|
+
require 'pp'
|
4
|
+
|
5
|
+
include XGen::Mongo::Driver
|
6
|
+
|
7
|
+
host = ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost'
|
8
|
+
port = ENV['MONGO_RUBY_DRIVER_PORT'] || XGen::Mongo::Driver::Mongo::DEFAULT_PORT
|
9
|
+
|
10
|
+
puts "Connecting to #{host}:#{port}"
|
11
|
+
db = Mongo.new(host, port).db('ruby-mongo-examples')
|
12
|
+
coll = db.create_collection('test')
|
13
|
+
|
14
|
+
# Erase all records from collection, if any
|
15
|
+
coll.clear
|
16
|
+
|
17
|
+
admin = db.admin
|
18
|
+
|
19
|
+
# Profiling level set/get
|
20
|
+
p admin.profiling_level
|
21
|
+
|
22
|
+
# Start profiling everything
|
23
|
+
admin.profiling_level = :all
|
24
|
+
|
25
|
+
# Read records, creating a profiling event
|
26
|
+
coll.find().to_a
|
27
|
+
|
28
|
+
# Stop profiling
|
29
|
+
admin.profiling_level = :off
|
30
|
+
|
31
|
+
# Print all profiling info
|
32
|
+
pp admin.profiling_info
|
33
|
+
|
34
|
+
# Validate returns a hash if all is well or raises an exception if there is a
|
35
|
+
# problem.
|
36
|
+
info = admin.validate_collection(coll.name)
|
37
|
+
puts "valid = #{info['ok']}"
|
38
|
+
puts info['result']
|
39
|
+
|
40
|
+
# Destroy the collection
|
41
|
+
coll.drop
|
data/examples/benchmarks.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require "rubygems"
|
2
1
|
require "benchmark"
|
3
2
|
|
4
3
|
$LOAD_PATH[0,0] = File.join(File.dirname(__FILE__), '..', 'lib')
|
@@ -17,7 +16,7 @@ TEST_COUNT = 100
|
|
17
16
|
|
18
17
|
puts "Generating benchmark data"
|
19
18
|
msgs = %w{hola hello aloha ciao}
|
20
|
-
arr = OBJS_COUNT.
|
19
|
+
arr = (0..OBJS_COUNT).collect {|x| { :number => x, :rndm => (rand(5)+1), :msg => msgs[rand(4)] }}
|
21
20
|
|
22
21
|
puts "Running benchmark"
|
23
22
|
Benchmark.bmbm do |results|
|
@@ -33,6 +32,11 @@ Benchmark.bmbm do |results|
|
|
33
32
|
coll.insert(arr)
|
34
33
|
}
|
35
34
|
}
|
35
|
+
results.report("find_first: ") {
|
36
|
+
TEST_COUNT.times {
|
37
|
+
coll.find_first(:number => 0)
|
38
|
+
}
|
39
|
+
}
|
36
40
|
end
|
37
41
|
|
38
42
|
coll.clear
|
data/examples/capped.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
$LOAD_PATH[0,0] = File.join(File.dirname(__FILE__), '..', 'lib')
|
2
|
+
require 'mongo'
|
3
|
+
|
4
|
+
include XGen::Mongo::Driver
|
5
|
+
|
6
|
+
host = ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost'
|
7
|
+
port = ENV['MONGO_RUBY_DRIVER_PORT'] || XGen::Mongo::Driver::Mongo::DEFAULT_PORT
|
8
|
+
|
9
|
+
puts "Connecting to #{host}:#{port}"
|
10
|
+
db = Mongo.new(host, port).db('ruby-mongo-examples')
|
11
|
+
db.drop_collection('test')
|
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.
|
16
|
+
coll = db.create_collection('test', :capped => true, :size => 1024, :max => 12)
|
17
|
+
|
18
|
+
100.times { |i| coll.insert('a' => i+1) }
|
19
|
+
|
20
|
+
# We will only see the last 12 records
|
21
|
+
coll.find().each { |row| p row }
|
22
|
+
|
23
|
+
coll.drop
|
data/examples/cursor.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
$LOAD_PATH[0,0] = File.join(File.dirname(__FILE__), '..', 'lib')
|
2
|
+
require 'mongo'
|
3
|
+
require 'pp'
|
4
|
+
|
5
|
+
include XGen::Mongo::Driver
|
6
|
+
|
7
|
+
host = ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost'
|
8
|
+
port = ENV['MONGO_RUBY_DRIVER_PORT'] || XGen::Mongo::Driver::Mongo::DEFAULT_PORT
|
9
|
+
|
10
|
+
puts "Connecting to #{host}:#{port}"
|
11
|
+
db = Mongo.new(host, port).db('ruby-mongo-examples')
|
12
|
+
coll = db.collection('test')
|
13
|
+
|
14
|
+
# Erase all records from collection, if any
|
15
|
+
coll.clear
|
16
|
+
|
17
|
+
# Insert 3 records
|
18
|
+
3.times { |i| coll.insert({'a' => i+1}) }
|
19
|
+
|
20
|
+
# Cursors don't run their queries until you actually attempt to retrieve data
|
21
|
+
# from them.
|
22
|
+
|
23
|
+
# Find returns a Cursor, which is Enumerable. You can iterate:
|
24
|
+
coll.find().each { |row| pp row }
|
25
|
+
|
26
|
+
# You can turn it into an array
|
27
|
+
array = coll.find().to_a
|
28
|
+
|
29
|
+
# You can iterate after turning it into an array (the cursor will iterate over
|
30
|
+
# the copy of the array that it saves internally.)
|
31
|
+
cursor = coll.find()
|
32
|
+
array = cursor.to_a
|
33
|
+
cursor.each { |row| pp row }
|
34
|
+
|
35
|
+
# You can get the next object
|
36
|
+
first_object = coll.find().next_object
|
37
|
+
|
38
|
+
# next_object returns nil if there are no more objects that match
|
39
|
+
cursor = coll.find()
|
40
|
+
obj = cursor.next_object
|
41
|
+
while obj
|
42
|
+
pp obj
|
43
|
+
obj = cursor.next_object
|
44
|
+
end
|
45
|
+
|
46
|
+
# Destroy the collection
|
47
|
+
coll.drop
|
data/examples/gridfs.rb
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
$LOAD_PATH[0,0] = File.join(File.dirname(__FILE__), '..', 'lib')
|
2
|
+
require 'mongo'
|
3
|
+
require 'mongo/gridfs'
|
4
|
+
|
5
|
+
include XGen::Mongo::Driver
|
6
|
+
include XGen::Mongo::GridFS
|
7
|
+
|
8
|
+
host = ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost'
|
9
|
+
port = ENV['MONGO_RUBY_DRIVER_PORT'] || XGen::Mongo::Driver::Mongo::DEFAULT_PORT
|
10
|
+
|
11
|
+
puts "Connecting to #{host}:#{port}"
|
12
|
+
db = Mongo.new(host, port).db('ruby-mongo-examples')
|
13
|
+
|
14
|
+
def dump(db, fname)
|
15
|
+
GridStore.open(db, fname, 'r') { |f| puts f.read }
|
16
|
+
end
|
17
|
+
|
18
|
+
# Write a new file
|
19
|
+
GridStore.open(db, 'foobar', 'w') { |f| f.write("hello, world!") }
|
20
|
+
|
21
|
+
# Read it and print out the contents
|
22
|
+
dump(db, 'foobar') # defined above
|
23
|
+
|
24
|
+
# Append more data
|
25
|
+
GridStore.open(db, 'foobar', 'w+') { |f| f.write("\n"); f.puts "line two" }
|
26
|
+
dump(db, 'foobar')
|
27
|
+
|
28
|
+
# Overwrite
|
29
|
+
GridStore.open(db, 'foobar', 'w') { |f| f.puts "hello, sailor!" }
|
30
|
+
dump(db, 'foobar')
|
31
|
+
|
32
|
+
# File existence tests
|
33
|
+
puts "File 'foobar' exists: #{GridStore.exist?(db, 'foobar')}"
|
34
|
+
puts "File 'does-not-exist' exists: #{GridStore.exist?(db, 'does-not-exist')}"
|
35
|
+
|
36
|
+
# Read with offset (uses seek)
|
37
|
+
puts GridStore.read(db, 'foobar', 6, 7)
|
38
|
+
|
39
|
+
# Rewind/seek/tell
|
40
|
+
GridStore.open(db, 'foobar', 'w') { |f|
|
41
|
+
f.write "hello, world!"
|
42
|
+
f.rewind
|
43
|
+
f.write "xyzzz"
|
44
|
+
puts f.tell # => 5
|
45
|
+
f.seek(4)
|
46
|
+
f.write('y')
|
47
|
+
}
|
48
|
+
dump(db, 'foobar') # => 'xyzzy'
|
49
|
+
|
50
|
+
# Unlink (delete)
|
51
|
+
GridStore.unlink(db, 'foobar')
|
52
|
+
puts "File 'foobar' exists after delete: #{GridStore.exist?(db, 'foobar')}"
|
53
|
+
|
54
|
+
# Metadata
|
55
|
+
GridStore.open(db, 'foobar', 'w') { |f| f.write("hello, world!") }
|
56
|
+
GridStore.open(db, 'foobar', 'r') { |f|
|
57
|
+
puts f.content_type
|
58
|
+
puts f.upload_date
|
59
|
+
puts f.chunk_size
|
60
|
+
puts f.metadata.inspect
|
61
|
+
}
|
62
|
+
|
63
|
+
# Add some metadata; change content type
|
64
|
+
GridStore.open(db, 'foobar', 'w+') { |f|
|
65
|
+
f.content_type = 'text/xml'
|
66
|
+
f.metadata = {'a' => 1}
|
67
|
+
}
|
68
|
+
# Print it
|
69
|
+
GridStore.open(db, 'foobar', 'r') { |f|
|
70
|
+
puts f.content_type
|
71
|
+
puts f.upload_date
|
72
|
+
puts f.chunk_size
|
73
|
+
puts f.metadata.inspect
|
74
|
+
}
|
75
|
+
|
76
|
+
# You can also set metadata when initially writing the file. Setting :root
|
77
|
+
# means that the file and its chunks are stored in a different root
|
78
|
+
# collection: instead of gridfs.files and gridfs.chunks, here we use
|
79
|
+
# my_files.files and my_files.chunks.
|
80
|
+
GridStore.open(db, 'foobar', 'w',
|
81
|
+
:content_type => 'text/plain',
|
82
|
+
:metadata => {'a' => 1},
|
83
|
+
:chunk_size => 1024 * 4,
|
84
|
+
:root => 'my_files') { |f|
|
85
|
+
f.puts 'hello, world'
|
86
|
+
}
|
87
|
+
|
data/examples/info.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
$LOAD_PATH[0,0] = File.join(File.dirname(__FILE__), '..', 'lib')
|
2
|
+
require 'mongo'
|
3
|
+
|
4
|
+
include XGen::Mongo::Driver
|
5
|
+
|
6
|
+
host = ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost'
|
7
|
+
port = ENV['MONGO_RUBY_DRIVER_PORT'] || XGen::Mongo::Driver::Mongo::DEFAULT_PORT
|
8
|
+
|
9
|
+
puts "Connecting to #{host}:#{port}"
|
10
|
+
db = Mongo.new(host, port).db('ruby-mongo-examples')
|
11
|
+
coll = db.collection('test')
|
12
|
+
|
13
|
+
# Erase all records from collection, if any
|
14
|
+
coll.clear
|
15
|
+
|
16
|
+
# Insert 3 records
|
17
|
+
3.times { |i| coll.insert({'a' => i+1}) }
|
18
|
+
|
19
|
+
# Collection names in database
|
20
|
+
p db.collection_names
|
21
|
+
|
22
|
+
# More information about each collection
|
23
|
+
p db.collections_info
|
24
|
+
|
25
|
+
# Index information
|
26
|
+
db.create_index('test', 'index_name', ['a'])
|
27
|
+
p db.index_information('test')
|
28
|
+
|
29
|
+
# Destroy the collection
|
30
|
+
coll.drop
|
data/examples/queries.rb
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
$LOAD_PATH[0,0] = File.join(File.dirname(__FILE__), '..', 'lib')
|
2
|
+
require 'mongo'
|
3
|
+
require 'pp'
|
4
|
+
|
5
|
+
include XGen::Mongo::Driver
|
6
|
+
|
7
|
+
host = ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost'
|
8
|
+
port = ENV['MONGO_RUBY_DRIVER_PORT'] || XGen::Mongo::Driver::Mongo::DEFAULT_PORT
|
9
|
+
|
10
|
+
puts "Connecting to #{host}:#{port}"
|
11
|
+
db = Mongo.new(host, port).db('ruby-mongo-examples')
|
12
|
+
coll = db.collection('test')
|
13
|
+
|
14
|
+
# Remove all records, if any
|
15
|
+
coll.clear
|
16
|
+
|
17
|
+
# Insert three records
|
18
|
+
coll.insert('a' => 1)
|
19
|
+
coll.insert('a' => 2)
|
20
|
+
coll.insert('b' => 3)
|
21
|
+
|
22
|
+
# Count.
|
23
|
+
puts "There are #{coll.count()} records."
|
24
|
+
|
25
|
+
# Find all records. find() returns a Cursor.
|
26
|
+
cursor = coll.find()
|
27
|
+
|
28
|
+
# Print them. Note that all records have an _id automatically added by the
|
29
|
+
# database. See pk.rb for an example of how to use a primary key factory to
|
30
|
+
# generate your own values for _id.
|
31
|
+
cursor.each { |row| pp row }
|
32
|
+
|
33
|
+
# Cursor has a to_a method that slurps all records into memory.
|
34
|
+
rows = coll.find().to_a
|
35
|
+
rows.each { |row| pp row }
|
36
|
+
|
37
|
+
# See Collection#find. From now on in this file, we won't be printing the
|
38
|
+
# records we find.
|
39
|
+
coll.find('a' => 1)
|
40
|
+
|
41
|
+
# Find records sort by 'a', offset 1, limit 2 records.
|
42
|
+
# Sort can be single name, array, or hash.
|
43
|
+
coll.find({}, {:offset => 1, :limit => 2, :sort => 'a'})
|
44
|
+
|
45
|
+
# Find all records with 'a' > 1. There is also $lt, $gte, and $lte.
|
46
|
+
coll.find({'a' => {'$gt' => 1}})
|
47
|
+
coll.find({'a' => {'$gt' => 1, '$lte' => 3}})
|
48
|
+
|
49
|
+
# Find all records with 'a' in a set of values.
|
50
|
+
coll.find('a' => {'$in' => [1,2]})
|
51
|
+
|
52
|
+
# Find by regexp
|
53
|
+
coll.find('a' => /[1|2]/)
|
54
|
+
|
55
|
+
# Print query explanation
|
56
|
+
pp coll.find('a' => /[1|2]/).explain()
|
57
|
+
|
58
|
+
# Use a hint with a query. Need an index. Hints can be stored with the
|
59
|
+
# collection, in which case they will be used with all queries, or they can be
|
60
|
+
# specified per query, in which case that hint overrides the hint associated
|
61
|
+
# with the collection if any.
|
62
|
+
coll.create_index('test_a_index', 'a')
|
63
|
+
coll.hint = 'a'
|
64
|
+
|
65
|
+
# You will see a different explanation now that the hint is in place
|
66
|
+
pp coll.find('a' => /[1|2]/).explain()
|
67
|
+
|
68
|
+
# Override hint for single query
|
69
|
+
coll.find({'a' => 1}, :hint => 'b')
|
data/examples/strict.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
$LOAD_PATH[0,0] = File.join(File.dirname(__FILE__), '..', 'lib')
|
2
|
+
require 'mongo'
|
3
|
+
|
4
|
+
include XGen::Mongo::Driver
|
5
|
+
|
6
|
+
host = ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost'
|
7
|
+
port = ENV['MONGO_RUBY_DRIVER_PORT'] || XGen::Mongo::Driver::Mongo::DEFAULT_PORT
|
8
|
+
|
9
|
+
puts "Connecting to #{host}:#{port}"
|
10
|
+
db = Mongo.new(host, port).db('ruby-mongo-examples')
|
11
|
+
|
12
|
+
db.drop_collection('does-not-exist')
|
13
|
+
db.create_collection('test')
|
14
|
+
|
15
|
+
db.strict = true
|
16
|
+
|
17
|
+
begin
|
18
|
+
# Can't reference collection that does not exist
|
19
|
+
db.collection('does-not-exist')
|
20
|
+
puts "error: expected exception"
|
21
|
+
rescue => ex
|
22
|
+
puts "expected exception: #{ex}"
|
23
|
+
end
|
24
|
+
|
25
|
+
begin
|
26
|
+
# Can't create collection that already exists
|
27
|
+
db.create_collection('test')
|
28
|
+
puts "error: expected exception"
|
29
|
+
rescue => ex
|
30
|
+
puts "expected exception: #{ex}"
|
31
|
+
end
|
32
|
+
|
33
|
+
db.strict = false
|
34
|
+
db.drop_collection('test')
|