mongodb-mongo 0.9 → 0.10
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.
- data/README.rdoc +15 -49
- data/lib/mongo/db.rb +5 -1
- data/lib/mongo/gridfs/grid_store.rb +12 -0
- data/lib/mongo/util/bson.rb +1 -1
- data/mongo-ruby-driver.gemspec +1 -1
- data/tests/test_bson.rb +7 -0
- data/tests/test_db.rb +6 -5
- data/tests/test_db_api.rb +10 -5
- data/tests/test_grid_store.rb +10 -0
- data/tests/test_round_trip.rb +1 -1
- metadata +3 -2
data/README.rdoc
CHANGED
@@ -1,11 +1,6 @@
|
|
1
1
|
= Introduction
|
2
2
|
|
3
|
-
This is a Ruby driver for
|
4
|
-
Mongo, see http://www.mongodb.org.
|
5
|
-
|
6
|
-
Start by reading the XGen::Mongo::Driver::Mongo and XGen::Mongo::Driver::DB
|
7
|
-
documentation, then move on to XGen::Mongo::Driver::Collection and
|
8
|
-
XGen::Mongo::Driver::Cursor.
|
3
|
+
This is a Ruby driver for MongoDB[http://www.mongodb.org].
|
9
4
|
|
10
5
|
Here is a quick code sample. See the files in the "examples" subdirectory for
|
11
6
|
many more.
|
@@ -23,8 +18,7 @@ many more.
|
|
23
18
|
coll.find().each { |doc| puts doc.inspect }
|
24
19
|
|
25
20
|
This driver also includes an implementation of a GridStore class, a Ruby
|
26
|
-
interface to Mongo's GridFS storage.
|
27
|
-
a separate project.
|
21
|
+
interface to Mongo's GridFS storage.
|
28
22
|
|
29
23
|
= Installation
|
30
24
|
|
@@ -78,7 +72,6 @@ Here's how to start mongo and run the "simple.rb" example:
|
|
78
72
|
|
79
73
|
See also the test code, especially tests/test_db_api.rb.
|
80
74
|
|
81
|
-
|
82
75
|
= The Driver
|
83
76
|
|
84
77
|
Here is some simple example code:
|
@@ -143,25 +136,15 @@ string.
|
|
143
136
|
== Primary Keys
|
144
137
|
|
145
138
|
The field _id is a primary key. It is treated specially by the database, and
|
146
|
-
its use makes many operations more efficient.
|
147
|
-
|
148
|
-
|
149
|
-
they be XGen::Mongo::Driver::ObjectID instances.)
|
150
|
-
|
151
|
-
The database itself inserts an _id value if none is specified when a record is
|
152
|
-
inserted.
|
153
|
-
|
154
|
-
The driver automatically sends the _id field to the database first, which is
|
155
|
-
how Mongo likes it. You don't have to worry about where the _id field is in
|
156
|
-
your hash record, or worry if you are using an OrderedHash or not.
|
139
|
+
its use makes many operations more efficient. The value of an _id may be of
|
140
|
+
any type. The database itself inserts an _id value if none is specified when
|
141
|
+
a record is inserted.
|
157
142
|
|
158
143
|
=== Primary Key Factories
|
159
144
|
|
160
145
|
A primary key factory is a class you supply to a DB object that knows how to
|
161
|
-
generate _id values.
|
162
|
-
|
163
|
-
one. However, if you want to control _id values or even their types, using a
|
164
|
-
PK factory lets you do so.
|
146
|
+
generate _id values. If you want to control _id values or even their types,
|
147
|
+
using a PK factory lets you do so.
|
165
148
|
|
166
149
|
You can tell the Ruby Mongo driver how to create primary keys by passing in
|
167
150
|
the :pk option to the Mongo#db method.
|
@@ -173,7 +156,7 @@ A primary key factory object must respond to :create_pk, which should take a
|
|
173
156
|
hash and return a hash which merges the original hash with any primary key
|
174
157
|
fields the factory wishes to inject. NOTE: if the object already has a primary
|
175
158
|
key, the factory should not inject a new key; this means that the object is
|
176
|
-
being used in a repsert but it already exists. The idea here is that
|
159
|
+
being used in a repsert but it already exists. The idea here is that whenever
|
177
160
|
a record is inserted, the :pk object's +create_pk+ method will be called and
|
178
161
|
the new hash returned will be inserted.
|
179
162
|
|
@@ -285,30 +268,6 @@ Then open the file html/index.html.
|
|
285
268
|
|
286
269
|
See the git log comments.
|
287
270
|
|
288
|
-
|
289
|
-
= To Do
|
290
|
-
|
291
|
-
* Tests for update and repsert.
|
292
|
-
|
293
|
-
* Add a way to specify a collection of databases on startup (a simple array of
|
294
|
-
IP address/port numbers, perhaps, or a hash or something). The driver would
|
295
|
-
then find the master and, on each subsequent command, ask that machine if it
|
296
|
-
is the master before proceeding.
|
297
|
-
|
298
|
-
* Introduce optional per-database and per-collection PKInjector.
|
299
|
-
|
300
|
-
* More tests.
|
301
|
-
|
302
|
-
== Optimizations
|
303
|
-
|
304
|
-
* Only update message sizes once, not after every write of a value. This will
|
305
|
-
require an explicit call to update_message_length in each message subclass.
|
306
|
-
|
307
|
-
* ensure_index commands should be cached to prevent excessive communication
|
308
|
-
with the database. (Or, the driver user should be informed that ensure_index
|
309
|
-
is not a lightweight operation for the particular driver.)
|
310
|
-
|
311
|
-
|
312
271
|
= Credits
|
313
272
|
|
314
273
|
Adrian Madrid, aemadrid@gmail.com
|
@@ -331,6 +290,13 @@ John Nunemaker, http://railstips.org
|
|
331
290
|
* Collection#create_index takes symbols as well as strings
|
332
291
|
* Fix for Collection#save
|
333
292
|
|
293
|
+
David James, djames@sunlightfoundation.com
|
294
|
+
* Fix dates to return as UTC
|
295
|
+
|
296
|
+
Paul Dlug, paul.dlug@gmail.com
|
297
|
+
* Generate _id on the client side if not provided
|
298
|
+
* Collection#insert and Collection#save return _id
|
299
|
+
|
334
300
|
= License
|
335
301
|
|
336
302
|
Copyright 2008-2009 10gen Inc.
|
data/lib/mongo/db.rb
CHANGED
@@ -475,9 +475,13 @@ module XGen
|
|
475
475
|
objects.collect! { |o|
|
476
476
|
@pk_factory.create_pk(o)
|
477
477
|
}
|
478
|
+
else
|
479
|
+
objects = objects.collect do |o|
|
480
|
+
o[:_id] || o['_id'] ? o : o.merge(:_id => ObjectID.new)
|
481
|
+
end
|
478
482
|
end
|
479
483
|
send_to_db(InsertMessage.new(@name, collection_name, true, *objects))
|
480
|
-
objects
|
484
|
+
objects.collect { |o| o[:_id] || o['_id'] }
|
481
485
|
}
|
482
486
|
end
|
483
487
|
|
@@ -93,6 +93,18 @@ module XGen
|
|
93
93
|
}
|
94
94
|
end
|
95
95
|
|
96
|
+
# List the contains of all GridFS files stored in the given db and
|
97
|
+
# root collection.
|
98
|
+
#
|
99
|
+
# :db :: the database to use
|
100
|
+
#
|
101
|
+
# :root_collection :: the root collection to use
|
102
|
+
def list(db, root_collection=DEFAULT_ROOT_COLLECTION)
|
103
|
+
db.collection("#{root_collection}.files").find().map { |f|
|
104
|
+
f['filename']
|
105
|
+
}
|
106
|
+
end
|
107
|
+
|
96
108
|
def readlines(db, name, separator=$/)
|
97
109
|
GridStore.open(db, name, 'r') { |gs|
|
98
110
|
gs.readlines(separator)
|
data/lib/mongo/util/bson.rb
CHANGED
@@ -245,7 +245,7 @@ class BSON
|
|
245
245
|
|
246
246
|
def deserialize_date_data(buf)
|
247
247
|
millisecs = buf.get_long()
|
248
|
-
Time.at(millisecs.to_f / 1000.0) # at() takes fractional seconds
|
248
|
+
Time.at(millisecs.to_f / 1000.0).utc # at() takes fractional seconds
|
249
249
|
end
|
250
250
|
|
251
251
|
def deserialize_boolean_data(buf)
|
data/mongo-ruby-driver.gemspec
CHANGED
@@ -79,7 +79,7 @@ TEST_FILES = ['tests/mongo-qa/_common.rb',
|
|
79
79
|
|
80
80
|
Gem::Specification.new do |s|
|
81
81
|
s.name = 'mongo'
|
82
|
-
s.version = '0.
|
82
|
+
s.version = '0.10'
|
83
83
|
s.platform = Gem::Platform::RUBY
|
84
84
|
s.summary = 'Ruby driver for the 10gen Mongo DB'
|
85
85
|
s.description = 'A Ruby driver for the 10gen Mongo DB. For more information about Mongo, see http://www.mongodb.org.'
|
data/tests/test_bson.rb
CHANGED
@@ -117,6 +117,13 @@ class BSONTest < Test::Unit::TestCase
|
|
117
117
|
assert_in_delta doc['date'], doc2['date'], 0.001
|
118
118
|
end
|
119
119
|
|
120
|
+
def test_date_returns_as_utc
|
121
|
+
doc = {'date' => Time.now}
|
122
|
+
@b.serialize(doc)
|
123
|
+
doc2 = @b.deserialize
|
124
|
+
assert doc2['date'].utc?
|
125
|
+
end
|
126
|
+
|
120
127
|
def test_dbref
|
121
128
|
oid = ObjectID.new
|
122
129
|
doc = {}
|
data/tests/test_db.rb
CHANGED
@@ -66,19 +66,20 @@ class DBTest < Test::Unit::TestCase
|
|
66
66
|
coll = db.collection('test')
|
67
67
|
coll.clear
|
68
68
|
|
69
|
+
insert_id = coll.insert('name' => 'Fred', 'age' => 42)
|
69
70
|
# new id gets added to returned object
|
70
|
-
obj = coll.insert('name' => 'Fred', 'age' => 42)
|
71
71
|
row = coll.find_first({'name' => 'Fred'}, :limit => 1)
|
72
72
|
oid = row['_id']
|
73
73
|
assert_not_nil oid
|
74
|
-
assert_equal
|
74
|
+
assert_equal insert_id, oid
|
75
75
|
|
76
76
|
oid = XGen::Mongo::Driver::ObjectID.new
|
77
|
-
|
78
|
-
|
77
|
+
data = {'_id' => oid, 'name' => 'Barney', 'age' => 41}
|
78
|
+
coll.insert(data)
|
79
|
+
row = coll.find_first({'name' => data['name']}, :limit => 1)
|
79
80
|
db_oid = row['_id']
|
80
81
|
assert_equal oid, db_oid
|
81
|
-
assert_equal
|
82
|
+
assert_equal data, row
|
82
83
|
|
83
84
|
coll.clear
|
84
85
|
end
|
data/tests/test_db_api.rb
CHANGED
@@ -13,7 +13,8 @@ class DBAPITest < Test::Unit::TestCase
|
|
13
13
|
|
14
14
|
def setup
|
15
15
|
@@coll.clear
|
16
|
-
@r1 =
|
16
|
+
@r1 = {'a' => 1}
|
17
|
+
@@coll.insert(@r1) # collection not created until it's used
|
17
18
|
@@coll_full_name = 'ruby-mongo-test.test'
|
18
19
|
end
|
19
20
|
|
@@ -29,8 +30,8 @@ class DBAPITest < Test::Unit::TestCase
|
|
29
30
|
end
|
30
31
|
|
31
32
|
def test_insert
|
32
|
-
@@coll.insert('a' => 2)
|
33
|
-
@@coll.insert('b' => 3)
|
33
|
+
assert_kind_of ObjectID, @@coll.insert('a' => 2)
|
34
|
+
assert_kind_of ObjectID, @@coll.insert('b' => 3)
|
34
35
|
|
35
36
|
assert_equal 3, @@coll.count
|
36
37
|
docs = @@coll.find().to_a
|
@@ -46,7 +47,11 @@ class DBAPITest < Test::Unit::TestCase
|
|
46
47
|
end
|
47
48
|
|
48
49
|
def test_insert_multiple
|
49
|
-
@@coll.insert({'a' => 2}, {'b' => 3})
|
50
|
+
ids = @@coll.insert({'a' => 2}, {'b' => 3})
|
51
|
+
|
52
|
+
ids.each do |i|
|
53
|
+
assert_kind_of ObjectID, i
|
54
|
+
end
|
50
55
|
|
51
56
|
assert_equal 3, @@coll.count
|
52
57
|
docs = @@coll.find().to_a
|
@@ -614,7 +619,7 @@ class DBAPITest < Test::Unit::TestCase
|
|
614
619
|
|
615
620
|
a = {"hello" => "world"}
|
616
621
|
|
617
|
-
@@coll.save(a)
|
622
|
+
assert_kind_of ObjectID, @@coll.save(a)
|
618
623
|
assert_equal 1, @@coll.count
|
619
624
|
|
620
625
|
@@coll.save(@@coll.find_first)
|
data/tests/test_grid_store.rb
CHANGED
@@ -31,6 +31,16 @@ class GridStoreTest < Test::Unit::TestCase
|
|
31
31
|
assert !GridStore.exist?(@@db, 'foobar', 'another_root')
|
32
32
|
end
|
33
33
|
|
34
|
+
def test_list
|
35
|
+
assert_equal ['foobar'], GridStore.list(@@db)
|
36
|
+
assert_equal ['foobar'], GridStore.list(@@db, 'fs')
|
37
|
+
assert_equal [], GridStore.list(@@db, 'my_fs')
|
38
|
+
|
39
|
+
GridStore.open(@@db, 'test', 'w') { |f| f.write("my file") }
|
40
|
+
|
41
|
+
assert_equal ['foobar', 'test'], GridStore.list(@@db)
|
42
|
+
end
|
43
|
+
|
34
44
|
def test_small_write
|
35
45
|
rows = @@files.find({'filename' => 'foobar'}).to_a
|
36
46
|
assert_not_nil rows
|
data/tests/test_round_trip.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongodb-mongo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: "0.
|
4
|
+
version: "0.10"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jim Menard
|
@@ -75,6 +75,7 @@ files:
|
|
75
75
|
- lib/mongo.rb
|
76
76
|
has_rdoc: true
|
77
77
|
homepage: http://www.mongodb.org
|
78
|
+
licenses:
|
78
79
|
post_install_message:
|
79
80
|
rdoc_options:
|
80
81
|
- --main
|
@@ -97,7 +98,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
97
98
|
requirements: []
|
98
99
|
|
99
100
|
rubyforge_project:
|
100
|
-
rubygems_version: 1.
|
101
|
+
rubygems_version: 1.3.5
|
101
102
|
signing_key:
|
102
103
|
specification_version: 2
|
103
104
|
summary: Ruby driver for the 10gen Mongo DB
|