mongo 1.7.1 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. data/{LICENSE.txt → LICENSE} +0 -0
  2. data/README.md +124 -111
  3. data/Rakefile +9 -325
  4. data/VERSION +1 -0
  5. data/bin/mongo_console +4 -4
  6. data/examples/admin.rb +43 -0
  7. data/examples/capped.rb +22 -0
  8. data/examples/cursor.rb +48 -0
  9. data/examples/gridfs.rb +44 -0
  10. data/examples/index_test.rb +126 -0
  11. data/examples/info.rb +31 -0
  12. data/examples/queries.rb +74 -0
  13. data/examples/replica_set.rb +26 -0
  14. data/examples/simple.rb +25 -0
  15. data/examples/strict.rb +35 -0
  16. data/examples/types.rb +36 -0
  17. data/{test/load → examples/web}/thin/load.rb +3 -1
  18. data/{test/load → examples/web}/unicorn/load.rb +5 -3
  19. data/lib/mongo.rb +8 -10
  20. data/lib/mongo/collection.rb +134 -114
  21. data/lib/mongo/cursor.rb +21 -14
  22. data/lib/mongo/db.rb +30 -28
  23. data/lib/mongo/exceptions.rb +1 -1
  24. data/lib/mongo/gridfs/grid.rb +8 -7
  25. data/lib/mongo/gridfs/grid_ext.rb +1 -1
  26. data/lib/mongo/gridfs/grid_file_system.rb +6 -5
  27. data/lib/mongo/gridfs/grid_io.rb +22 -19
  28. data/lib/mongo/legacy.rb +82 -0
  29. data/lib/mongo/{connection.rb → mongo_client.rb} +82 -61
  30. data/lib/mongo/{repl_set_connection.rb → mongo_replica_set_client.rb} +54 -39
  31. data/lib/mongo/{sharded_connection.rb → mongo_sharded_client.rb} +9 -9
  32. data/lib/mongo/networking.rb +25 -20
  33. data/lib/mongo/util/conversions.rb +1 -1
  34. data/lib/mongo/util/core_ext.rb +1 -1
  35. data/lib/mongo/util/logging.rb +20 -4
  36. data/lib/mongo/util/node.rb +16 -16
  37. data/lib/mongo/util/pool.rb +56 -27
  38. data/lib/mongo/util/pool_manager.rb +28 -27
  39. data/lib/mongo/util/server_version.rb +1 -1
  40. data/lib/mongo/util/sharding_pool_manager.rb +8 -8
  41. data/lib/mongo/util/ssl_socket.rb +1 -5
  42. data/lib/mongo/util/support.rb +24 -8
  43. data/lib/mongo/util/tcp_socket.rb +0 -4
  44. data/lib/mongo/util/uri_parser.rb +54 -38
  45. data/lib/mongo/util/write_concern.rb +67 -0
  46. data/mongo.gemspec +21 -32
  47. data/test/auxillary/{1.4_features.rb → 1.4_feature_test.rb} +4 -5
  48. data/test/auxillary/authentication_test.rb +18 -20
  49. data/test/auxillary/autoreconnect_test.rb +3 -5
  50. data/test/auxillary/fork_test.rb +5 -7
  51. data/test/auxillary/repl_set_auth_test.rb +13 -15
  52. data/test/auxillary/slave_connection_test.rb +8 -7
  53. data/test/auxillary/threaded_authentication_test.rb +15 -17
  54. data/test/bson/binary_test.rb +1 -1
  55. data/test/bson/bson_test.rb +60 -36
  56. data/test/bson/byte_buffer_test.rb +1 -1
  57. data/test/bson/hash_with_indifferent_access_test.rb +2 -2
  58. data/test/bson/json_test.rb +1 -2
  59. data/test/bson/object_id_test.rb +1 -2
  60. data/test/bson/ordered_hash_test.rb +1 -1
  61. data/test/bson/timestamp_test.rb +1 -1
  62. data/test/{collection_test.rb → functional/collection_test.rb} +57 -57
  63. data/test/{connection_test.rb → functional/connection_test.rb} +75 -89
  64. data/test/{conversions_test.rb → functional/conversions_test.rb} +1 -1
  65. data/test/{cursor_fail_test.rb → functional/cursor_fail_test.rb} +3 -29
  66. data/test/{cursor_message_test.rb → functional/cursor_message_test.rb} +1 -1
  67. data/test/{cursor_test.rb → functional/cursor_test.rb} +5 -1
  68. data/test/{db_api_test.rb → functional/db_api_test.rb} +8 -9
  69. data/test/{db_connection_test.rb → functional/db_connection_test.rb} +3 -5
  70. data/test/{db_test.rb → functional/db_test.rb} +13 -13
  71. data/test/{grid_file_system_test.rb → functional/grid_file_system_test.rb} +2 -2
  72. data/test/{grid_io_test.rb → functional/grid_io_test.rb} +6 -6
  73. data/test/{grid_test.rb → functional/grid_test.rb} +4 -10
  74. data/test/{pool_test.rb → functional/pool_test.rb} +1 -1
  75. data/test/functional/safe_test.rb +84 -0
  76. data/test/{support_test.rb → functional/support_test.rb} +1 -1
  77. data/test/{threading_test.rb → functional/threading_test.rb} +9 -9
  78. data/test/{timeout_test.rb → functional/timeout_test.rb} +1 -1
  79. data/test/{uri_test.rb → functional/uri_test.rb} +1 -1
  80. data/test/functional/write_concern_test.rb +104 -0
  81. data/test/replica_set/basic_test.rb +139 -0
  82. data/test/replica_set/client_test.rb +255 -0
  83. data/test/replica_set/complex_connect_test.rb +62 -0
  84. data/test/replica_set/connection_test.rb +255 -0
  85. data/test/{replica_sets → replica_set}/count_test.rb +17 -14
  86. data/test/replica_set/cursor_test.rb +75 -0
  87. data/test/{replica_sets → replica_set}/insert_test.rb +19 -16
  88. data/test/replica_set/query_test.rb +64 -0
  89. data/test/replica_set/refresh_test.rb +153 -0
  90. data/test/{replica_sets → replica_set}/replication_ack_test.rb +21 -17
  91. data/test/sharded_cluster/basic_test.rb +31 -50
  92. data/test/support/hash_with_indifferent_access.rb +1 -1
  93. data/test/test_helper.rb +56 -9
  94. data/test/threading/threading_with_large_pool_test.rb +8 -8
  95. data/test/tools/mongo_config.rb +270 -58
  96. data/test/tools/mongo_config_test.rb +146 -0
  97. data/test/unit/client_test.rb +230 -0
  98. data/test/unit/collection_test.rb +45 -32
  99. data/test/unit/connection_test.rb +82 -74
  100. data/test/unit/cursor_test.rb +14 -6
  101. data/test/unit/db_test.rb +8 -8
  102. data/test/unit/grid_test.rb +11 -11
  103. data/test/unit/node_test.rb +24 -24
  104. data/test/unit/pool_manager_test.rb +13 -13
  105. data/test/unit/pool_test.rb +1 -1
  106. data/test/unit/read_test.rb +21 -26
  107. data/test/unit/safe_test.rb +52 -33
  108. data/test/unit/util_test.rb +55 -0
  109. data/test/unit/write_concern_test.rb +161 -0
  110. metadata +158 -171
  111. data/docs/CREDITS.md +0 -123
  112. data/docs/FAQ.md +0 -116
  113. data/docs/GRID_FS.md +0 -158
  114. data/docs/HISTORY.md +0 -392
  115. data/docs/READ_PREFERENCE.md +0 -99
  116. data/docs/RELEASES.md +0 -54
  117. data/docs/REPLICA_SETS.md +0 -113
  118. data/docs/TAILABLE_CURSORS.md +0 -51
  119. data/docs/TUTORIAL.md +0 -356
  120. data/docs/WRITE_CONCERN.md +0 -31
  121. data/lib/mongo/gridfs/grid_io_fix.rb +0 -38
  122. data/lib/mongo/version.rb +0 -3
  123. data/test/bson/test_helper.rb +0 -30
  124. data/test/replica_sets/basic_test.rb +0 -119
  125. data/test/replica_sets/complex_connect_test.rb +0 -57
  126. data/test/replica_sets/complex_read_preference_test.rb +0 -237
  127. data/test/replica_sets/connect_test.rb +0 -156
  128. data/test/replica_sets/cursor_test.rb +0 -70
  129. data/test/replica_sets/pooled_insert_test.rb +0 -57
  130. data/test/replica_sets/query_test.rb +0 -50
  131. data/test/replica_sets/read_preference_test.rb +0 -234
  132. data/test/replica_sets/refresh_test.rb +0 -156
  133. data/test/replica_sets/refresh_with_threads_test.rb +0 -60
  134. data/test/replica_sets/rs_test_helper.rb +0 -39
  135. data/test/safe_test.rb +0 -68
  136. data/test/sharded_cluster/mongo_config_test.rb +0 -126
  137. data/test/sharded_cluster/sc_test_helper.rb +0 -39
  138. data/test/tools/repl_set_manager.rb +0 -418
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.8.0
@@ -10,12 +10,12 @@ require 'mongo'
10
10
  include Mongo
11
11
 
12
12
  host = org_argv[0] || ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost'
13
- port = org_argv[1] || ENV['MONGO_RUBY_DRIVER_PORT'] || Connection::DEFAULT_PORT
13
+ port = org_argv[1] || ENV['MONGO_RUBY_DRIVER_PORT'] || MongoClient::DEFAULT_PORT
14
14
  dbnm = org_argv[2] || ENV['MONGO_RUBY_DRIVER_DB'] || 'ruby-mongo-console'
15
15
 
16
- puts "Connecting to #{host}:#{port} (CONN) on with database #{dbnm} (DB)"
17
- CONN = Connection.new(host, port)
18
- DB = CONN.db(dbnm)
16
+ puts "Connecting to #{host}:#{port} (CLIENT) on with database #{dbnm} (DB)"
17
+ CLIENT = MongoClient.new(host, port)
18
+ DB = CLIENT.db(dbnm)
19
19
 
20
20
  puts "Starting IRB session..."
21
21
  IRB.start(__FILE__)
@@ -0,0 +1,43 @@
1
+ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+
3
+ require 'mongo'
4
+ require 'pp'
5
+
6
+ include Mongo
7
+
8
+ host = ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost'
9
+ port = ENV['MONGO_RUBY_DRIVER_PORT'] || MongoClient::DEFAULT_PORT
10
+
11
+ puts "Connecting to #{host}:#{port}"
12
+ client = MongoClient.new(host, port)
13
+ db = client.db('ruby-mongo-examples')
14
+ coll = db.create_collection('test')
15
+
16
+ # Erase all records from collection, if any
17
+ coll.remove
18
+
19
+ admin = client['admin']
20
+
21
+ # Profiling level set/get
22
+ puts "Profiling level: #{admin.profiling_level}"
23
+
24
+ # Start profiling everything
25
+ admin.profiling_level = :all
26
+
27
+ # Read records, creating a profiling event
28
+ coll.find().to_a
29
+
30
+ # Stop profiling
31
+ admin.profiling_level = :off
32
+
33
+ # Print all profiling info
34
+ pp admin.profiling_info
35
+
36
+ # Validate returns a hash if all is well and
37
+ # raises an exception if there is a problem.
38
+ info = db.validate_collection(coll.name)
39
+ puts "valid = #{info['ok']}"
40
+ puts info['result']
41
+
42
+ # Destroy the collection
43
+ coll.drop
@@ -0,0 +1,22 @@
1
+ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ require 'mongo'
3
+
4
+ include Mongo
5
+
6
+ host = ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost'
7
+ port = ENV['MONGO_RUBY_DRIVER_PORT'] || MongoClient::DEFAULT_PORT
8
+
9
+ puts "Connecting to #{host}:#{port}"
10
+ db = MongoClient.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 reached.
15
+ coll = db.create_collection('test', :capped => true, :size => 1024, :max => 12)
16
+
17
+ 100.times { |i| coll.insert('a' => i+1) }
18
+
19
+ # We will only see the last 12 records
20
+ coll.find().each { |row| p row }
21
+
22
+ coll.drop
@@ -0,0 +1,48 @@
1
+ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+
3
+ require 'mongo'
4
+ require 'pp'
5
+
6
+ include Mongo
7
+
8
+ host = ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost'
9
+ port = ENV['MONGO_RUBY_DRIVER_PORT'] || MongoClient::DEFAULT_PORT
10
+
11
+ puts "Connecting to #{host}:#{port}"
12
+ db = MongoClient.new(host, port).db('ruby-mongo-examples')
13
+ coll = db.collection('test')
14
+
15
+ # Erase all records from collection, if any
16
+ coll.remove
17
+
18
+ # Insert 3 records
19
+ 3.times { |i| coll.insert({'a' => i+1}) }
20
+
21
+ # Cursors don't run their queries until you actually attempt to retrieve data
22
+ # from them.
23
+
24
+ # Find returns a Cursor, which is Enumerable. You can iterate:
25
+ coll.find().each { |row| pp row }
26
+
27
+ # You can turn it into an array:
28
+ array = coll.find().to_a
29
+
30
+ # You can iterate after turning it into an array (the cursor will iterate over
31
+ # the copy of the array that it saves internally.)
32
+ cursor = coll.find()
33
+ array = cursor.to_a
34
+ cursor.each { |row| pp row }
35
+
36
+ # You can get the next object
37
+ first_object = coll.find().next_document
38
+
39
+ # next_document returns nil if there are no more objects that match
40
+ cursor = coll.find()
41
+ obj = cursor.next_document
42
+ while obj
43
+ pp obj
44
+ obj = cursor.next_document
45
+ end
46
+
47
+ # Destroy the collection
48
+ coll.drop
@@ -0,0 +1,44 @@
1
+ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ def assert
3
+ raise "Failed!" unless yield
4
+ end
5
+
6
+ require 'mongo'
7
+ include Mongo
8
+
9
+ host = ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost'
10
+ port = ENV['MONGO_RUBY_DRIVER_PORT'] || MongoClient::DEFAULT_PORT
11
+
12
+ puts "Connecting to #{host}:#{port}"
13
+ db = MongoClient.new(host, port).db('ruby-mongo-examples')
14
+
15
+ data = "hello, world!"
16
+
17
+ grid = Grid.new(db)
18
+
19
+ # Write a new file. data can be a string or an io object responding to #read.
20
+ id = grid.put(data, :filename => 'hello.txt')
21
+
22
+ # Read it and print out the contents
23
+ file = grid.get(id)
24
+ puts file.read
25
+
26
+ # Delete the file
27
+ grid.delete(id)
28
+
29
+ begin
30
+ grid.get(id)
31
+ rescue => e
32
+ assert {e.class == Mongo::GridError}
33
+ end
34
+
35
+ # Metadata
36
+ id = grid.put(data, :filename => 'hello.txt', :content_type => 'text/plain', :metadata => {'name' => 'hello'})
37
+ file = grid.get(id)
38
+
39
+ p file.content_type
40
+ p file.metadata.inspect
41
+ p file.chunk_size
42
+ p file.file_length
43
+ p file.filename
44
+ p file.data
@@ -0,0 +1,126 @@
1
+ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+
3
+ require 'mongo'
4
+
5
+ include Mongo
6
+
7
+ host = ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost'
8
+ port = ENV['MONGO_RUBY_DRIVER_PORT'] || MongoClient::DEFAULT_PORT
9
+
10
+ puts ">> Connecting to #{host}:#{port}"
11
+ db = MongoClient.new(host, port).db('ruby-mongo-index_test')
12
+
13
+ class Exception
14
+ def errmsg
15
+ "%s: %s\n%s" % [self.class, message, (backtrace || []).join("\n") << "\n"]
16
+ end
17
+ end
18
+
19
+ puts ">> Dropping collection test"
20
+ begin
21
+ res = db.drop_collection('test')
22
+ puts "dropped : #{res.inspect}"
23
+ rescue => e
24
+ puts "Error: #{e.errmsg}"
25
+ end
26
+
27
+ puts ">> Creating collection test"
28
+ begin
29
+ coll = db.collection('test')
30
+ puts "created : #{coll.inspect}"
31
+ rescue => e
32
+ puts "Error: #{e.errmsg}"
33
+ end
34
+
35
+ OBJS_COUNT = 100
36
+
37
+ puts ">> Generating test data"
38
+ msgs = %w{hola hello aloha ciao}
39
+ arr = (0...OBJS_COUNT).collect {|x| { :number => x, :rndm => (rand(5)+1), :msg => msgs[rand(4)] }}
40
+ puts "generated"
41
+
42
+ puts ">> Inserting data (#{arr.size})"
43
+ coll.insert(arr)
44
+ puts "inserted"
45
+
46
+ puts ">> Creating index"
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]]
49
+ puts "created index: #{res.inspect}"
50
+ # ============================ Mongo Log ============================
51
+ # Fri Dec 5 14:45:02 Adding all existing records for ruby-mongo-console.test to new index
52
+ # ***
53
+ # Bad data or size in BSONElement::size()
54
+ # bad type:30
55
+ # totalsize:11 fieldnamesize:4
56
+ # lastrec:
57
+ # Fri Dec 5 14:45:02 ruby-mongo-console.system.indexes Assertion failure false jsobj.cpp a0
58
+ # Fri Dec 5 14:45:02 database: ruby-mongo-console op:7d2 0
59
+ # Fri Dec 5 14:45:02 ns: ruby-mongo-console.system.indexes
60
+
61
+ puts ">> Gathering index information"
62
+ begin
63
+ res = coll.index_information
64
+ puts "index_information : #{res.inspect}"
65
+ rescue => e
66
+ puts "Error: #{e.errmsg}"
67
+ end
68
+ # ============================ Console Output ============================
69
+ # RuntimeError: Keys for index on return from db was nil. Coll = ruby-mongo-console.test
70
+ # from ./bin/../lib/mongo/db.rb:135:in `index_information'
71
+ # from (irb):11:in `collect'
72
+ # from ./bin/../lib/mongo/cursor.rb:47:in `each'
73
+ # from ./bin/../lib/mongo/db.rb:130:in `collect'
74
+ # from ./bin/../lib/mongo/db.rb:130:in `index_information'
75
+ # from ./bin/../lib/mongo/collection.rb:74:in `index_information'
76
+ # from (irb):11
77
+
78
+ puts ">> Dropping index"
79
+ begin
80
+ res = coll.drop_index "number_1_rndm_1_msg_1"
81
+ puts "dropped : #{res.inspect}"
82
+ rescue => e
83
+ puts "Error: #{e.errmsg}"
84
+ end
85
+
86
+ # ============================ Console Output ============================
87
+ # => {"nIndexesWas"=>2.0, "ok"=>1.0}
88
+ # ============================ Mongo Log ============================
89
+ # 0x41802a 0x411549 0x42bac6 0x42c1f6 0x42c55b 0x42e6f7 0x41631e 0x41a89d 0x41ade2 0x41b448 0x4650d2 0x4695ad
90
+ # db/db(_Z12sayDbContextPKc+0x17a) [0x41802a]
91
+ # db/db(_Z8assertedPKcS0_j+0x9) [0x411549]
92
+ # db/db(_ZNK11BSONElement4sizeEv+0x1f6) [0x42bac6]
93
+ # db/db(_ZN7BSONObj8getFieldEPKc+0xa6) [0x42c1f6]
94
+ # db/db(_ZN7BSONObj14getFieldDottedEPKc+0x11b) [0x42c55b]
95
+ # db/db(_ZN7BSONObj19extractFieldsDottedES_R14BSONObjBuilder+0x87) [0x42e6f7]
96
+ # db/db(_ZN12IndexDetails17getKeysFromObjectER7BSONObjRSt3setIS0_St4lessIS0_ESaIS0_EE+0x24e) [0x41631e]
97
+ # db/db(_Z12_indexRecordR12IndexDetailsR7BSONObj7DiskLoc+0x5d) [0x41a89d]
98
+ # db/db(_Z18addExistingToIndexPKcR12IndexDetails+0xb2) [0x41ade2]
99
+ # db/db(_ZN11DataFileMgr6insertEPKcPKvib+0x508) [0x41b448]
100
+ # db/db(_Z14receivedInsertR7MessageRSt18basic_stringstreamIcSt11char_traitsIcESaIcEE+0x112) [0x4650d2]
101
+ # db/db(_Z10connThreadv+0xb4d) [0x4695ad]
102
+ # Fri Dec 5 14:45:02 ruby-mongo-console.system.indexes Caught Assertion insert, continuing
103
+ # Fri Dec 5 14:47:59 CMD: deleteIndexes ruby-mongo-console.test
104
+ # d->nIndexes was 2
105
+ # alpha implementation, space not reclaimed
106
+
107
+ puts ">> Gathering index information"
108
+ begin
109
+ res = coll.index_information
110
+ puts "index_information : #{res.inspect}"
111
+ rescue => e
112
+ puts "Error: #{e.errmsg}"
113
+ end
114
+ # ============================ Console Output ============================
115
+ # RuntimeError: Keys for index on return from db was nil. Coll = ruby-mongo-console.test
116
+ # from ./bin/../lib/mongo/db.rb:135:in `index_information'
117
+ # from (irb):15:in `collect'
118
+ # from ./bin/../lib/mongo/cursor.rb:47:in `each'
119
+ # from ./bin/../lib/mongo/db.rb:130:in `collect'
120
+ # from ./bin/../lib/mongo/db.rb:130:in `index_information'
121
+ # from ./bin/../lib/mongo/collection.rb:74:in `index_information'
122
+ # from (irb):15
123
+
124
+ puts ">> Closing connection"
125
+ db.close
126
+ puts "closed"
@@ -0,0 +1,31 @@
1
+ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+
3
+ require 'mongo'
4
+
5
+ include Mongo
6
+
7
+ host = ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost'
8
+ port = ENV['MONGO_RUBY_DRIVER_PORT'] || MongoClient::DEFAULT_PORT
9
+
10
+ puts "Connecting to #{host}:#{port}"
11
+ db = MongoClient.new(host, port).db('ruby-mongo-examples')
12
+ coll = db.collection('test')
13
+
14
+ # Erase all records from collection, if any
15
+ coll.remove
16
+
17
+ # Insert 3 records
18
+ 3.times { |i| coll.insert({'a' => i+1}) }
19
+
20
+ # Collection names in database
21
+ p db.collection_names
22
+
23
+ # More information about each collection
24
+ p db.collections_info
25
+
26
+ # Index information
27
+ coll.create_index('a')
28
+ p db.index_information('test')
29
+
30
+ # Destroy the collection
31
+ coll.drop
@@ -0,0 +1,74 @@
1
+ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+
3
+ require 'mongo'
4
+ require 'pp'
5
+
6
+ include Mongo
7
+
8
+ host = ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost'
9
+ port = ENV['MONGO_RUBY_DRIVER_PORT'] || MongoClient::DEFAULT_PORT
10
+
11
+ puts "Connecting to #{host}:#{port}"
12
+ db = MongoClient.new(host, port).db('ruby-mongo-examples')
13
+ coll = db.collection('test')
14
+
15
+ # Remove all records, if any
16
+ coll.remove
17
+
18
+ # Insert three records
19
+ coll.insert('a' => 1)
20
+ coll.insert('a' => 2)
21
+ coll.insert('b' => 3)
22
+ coll.insert('c' => 'foo')
23
+ coll.insert('c' => 'bar')
24
+
25
+ # Count.
26
+ puts "There are #{coll.count} records."
27
+
28
+ # Find all records. find() returns a Cursor.
29
+ puts "Find all records:"
30
+ pp cursor = coll.find.to_a
31
+
32
+ # Print them. Note that all records have an _id automatically added by the
33
+ # database. See pk.rb for an example of how to use a primary key factory to
34
+ # generate your own values for _id.
35
+ puts "Print each document individually:"
36
+ pp cursor.each { |row| pp row }
37
+
38
+ # See Collection#find. From now on in this file, we won't be printing the
39
+ # records we find.
40
+ puts "Find one record:"
41
+ pp coll.find('a' => 1).to_a
42
+
43
+ # Find records sort by 'a', skip 1, limit 2 records.
44
+ # Sort can be single name, array, or hash.
45
+ puts "Skip 1, limit 2, sort by 'a':"
46
+ pp coll.find({}, {:skip => 1, :limit => 2, :sort => 'a'}).to_a
47
+
48
+ # Find all records with 'a' > 1. There is also $lt, $gte, and $lte.
49
+ coll.find({'a' => {'$gt' => 1}})
50
+ coll.find({'a' => {'$gt' => 1, '$lte' => 3}})
51
+
52
+ # Find all records with 'a' in a set of values.
53
+ puts "Find all records where a is $in [1, 2]:"
54
+ pp coll.find('a' => {'$in' => [1,2]}).to_a
55
+
56
+ puts "Find by regex:"
57
+ pp coll.find({'c' => /f/}).to_a
58
+
59
+ # Print query explanation
60
+ puts "Print an explain:"
61
+ pp coll.find({'c' => /f/}).explain
62
+
63
+ # Use a hint with a query. Need an index. Hints can be stored with the
64
+ # collection, in which case they will be used with all queries, or they can be
65
+ # specified per query, in which case that hint overrides the hint associated
66
+ # with the collection if any.
67
+ coll.create_index('c')
68
+ coll.hint = 'c'
69
+
70
+ puts "Print an explain with index:"
71
+ pp coll.find('c' => /[f|b]/).explain
72
+
73
+ puts "Print an explain with natural order hint:"
74
+ pp coll.find({'c' => /[f|b]/}, :hint => '$natural').explain
@@ -0,0 +1,26 @@
1
+ # This code assumes a running replica set with at least one node at localhost:27017.
2
+ require 'mongo'
3
+
4
+ include Mongo
5
+
6
+ cons = []
7
+
8
+ 10.times do
9
+ cons << MongoReplicaSetClient(['localhost:27017'], :read => :secondary)
10
+ end
11
+
12
+ ports = cons.map do |con|
13
+ con.read_pool.port
14
+ end
15
+
16
+ puts "These ten connections will read from the following ports:"
17
+ p ports
18
+
19
+ cons[rand(10)]['foo']['bar'].remove
20
+ 100.times do |n|
21
+ cons[rand(10)]['foo']['bar'].insert({:a => n})
22
+ end
23
+
24
+ 100.times do |n|
25
+ p cons[rand(10)]['foo']['bar'].find_one({:a => n})
26
+ end
@@ -0,0 +1,25 @@
1
+ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+
3
+ require 'rubygems'
4
+ require 'mongo'
5
+
6
+ include Mongo
7
+
8
+ host = ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost'
9
+ port = ENV['MONGO_RUBY_DRIVER_PORT'] || MongoClient::DEFAULT_PORT
10
+
11
+ puts "Connecting to #{host}:#{port}"
12
+ db = MongoClient.new(host, port).db('ruby-mongo-examples')
13
+ coll = db.collection('test')
14
+
15
+ # Erase all records from collection, if any
16
+ coll.remove
17
+
18
+ # Insert 3 records
19
+ 3.times { |i| coll.insert({'a' => i+1}) }
20
+
21
+ puts "There are #{coll.count()} records in the test collection. Here they are:"
22
+ coll.find().each { |doc| puts doc.inspect }
23
+
24
+ # Destroy the collection
25
+ coll.drop