mongodb-mongo 0.6.6 → 0.6.7
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 +0 -4
- data/Rakefile +1 -1
- data/lib/mongo/collection.rb +42 -0
- data/lib/mongo/db.rb +5 -0
- data/lib/mongo/util/bson.rb +7 -1
- data/mongo-ruby-driver.gemspec +1 -1
- data/tests/test_db_api.rb +36 -0
- metadata +1 -1
data/README.rdoc
CHANGED
@@ -288,10 +288,6 @@ See the git log comments.
|
|
288
288
|
|
289
289
|
= To Do
|
290
290
|
|
291
|
-
* Add group_by. Need to figure out how we are going to send functions. The
|
292
|
-
current thinking is that Mongo will allow a subset of JavaScript (which we
|
293
|
-
would have to send as a string), but this is still under discussion.
|
294
|
-
|
295
291
|
* Tests for update and repsert.
|
296
292
|
|
297
293
|
* Add a way to specify a collection of databases on startup (a simple array of
|
data/Rakefile
CHANGED
@@ -23,7 +23,7 @@ desc "Generate documentation"
|
|
23
23
|
task :rdoc do
|
24
24
|
version = eval(File.read("mongo-ruby-driver.gemspec")).version
|
25
25
|
out = File.join('html', version.to_s)
|
26
|
-
FileUtils.rm_rf(
|
26
|
+
FileUtils.rm_rf('html')
|
27
27
|
system "rdoc --main README.rdoc --op #{out} --inline-source --quiet README.rdoc `find lib -name '*.rb'`"
|
28
28
|
end
|
29
29
|
|
data/lib/mongo/collection.rb
CHANGED
@@ -139,6 +139,48 @@ module XGen
|
|
139
139
|
@db.drop_collection(@name)
|
140
140
|
end
|
141
141
|
|
142
|
+
# Perform a query similar to an SQL group by operation.
|
143
|
+
#
|
144
|
+
# Returns an array of grouped items.
|
145
|
+
#
|
146
|
+
# :keys :: list of fields to group by
|
147
|
+
# :condition :: specification of rows to be considered (as a 'find'
|
148
|
+
# query specification)
|
149
|
+
# :initial :: initial value of the aggregation counter object
|
150
|
+
# :reduce :: aggregation function as a JavaScript string
|
151
|
+
def group(keys, condition, initial, reduce)
|
152
|
+
group_function = <<EOS
|
153
|
+
function () {
|
154
|
+
var c = db[ns].find(condition);
|
155
|
+
var map = new Map();
|
156
|
+
var reduce_function = #{reduce};
|
157
|
+
while (c.hasNext()) {
|
158
|
+
var obj = c.next();
|
159
|
+
|
160
|
+
var key = {};
|
161
|
+
for (var i in keys) {
|
162
|
+
key[keys[i]] = obj[keys[i]];
|
163
|
+
}
|
164
|
+
|
165
|
+
var aggObj = map[key];
|
166
|
+
if (aggObj == null) {
|
167
|
+
var newObj = Object.extend({}, key);
|
168
|
+
aggObj = map[key] = Object.extend(newObj, initial);
|
169
|
+
}
|
170
|
+
reduce_function(obj, aggObj);
|
171
|
+
}
|
172
|
+
return {"result": map.values()};
|
173
|
+
}
|
174
|
+
EOS
|
175
|
+
return @db.eval(Code.new(group_function,
|
176
|
+
{
|
177
|
+
"ns" => @name,
|
178
|
+
"keys" => keys,
|
179
|
+
"condition" => condition,
|
180
|
+
"initial" => initial
|
181
|
+
}))["result"]
|
182
|
+
end
|
183
|
+
|
142
184
|
# Return an array of hashes, one for each index. Each hash contains:
|
143
185
|
#
|
144
186
|
# :name :: Index name
|
data/lib/mongo/db.rb
CHANGED
@@ -372,6 +372,11 @@ module XGen
|
|
372
372
|
raise "Error with count command: #{doc.inspect}"
|
373
373
|
end
|
374
374
|
|
375
|
+
# Dereference a DBRef, getting the document it points to.
|
376
|
+
def dereference(dbref)
|
377
|
+
collection(dbref.namespace).find_first("_id" => dbref.object_id)
|
378
|
+
end
|
379
|
+
|
375
380
|
# Evaluate a JavaScript expression on MongoDB.
|
376
381
|
# +code+ should be a string or Code instance containing a JavaScript
|
377
382
|
# expression. Additional arguments will be passed to that expression
|
data/lib/mongo/util/bson.rb
CHANGED
@@ -85,7 +85,13 @@ class BSON
|
|
85
85
|
@buf.put_int(0)
|
86
86
|
|
87
87
|
# Write key/value pairs. Always write _id first if it exists.
|
88
|
-
|
88
|
+
if obj.has_key? '_id'
|
89
|
+
oid = obj['_id']
|
90
|
+
elsif obj.has_key? :_id
|
91
|
+
oid = obj[:_id]
|
92
|
+
else
|
93
|
+
oid = false
|
94
|
+
end
|
89
95
|
serialize_key_value('_id', oid) if oid
|
90
96
|
obj.each {|k, v| serialize_key_value(k, v) unless k == '_id' || k == :_id }
|
91
97
|
|
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.6.
|
82
|
+
s.version = '0.6.7'
|
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_db_api.rb
CHANGED
@@ -522,6 +522,42 @@ class DBAPITest < Test::Unit::TestCase
|
|
522
522
|
end
|
523
523
|
end
|
524
524
|
|
525
|
+
def test_hash_default_value_id
|
526
|
+
val = Hash.new(0)
|
527
|
+
val["x"] = 5
|
528
|
+
@@coll.insert val
|
529
|
+
id = @@coll.find_first("x" => 5)["_id"]
|
530
|
+
assert id != 0
|
531
|
+
end
|
532
|
+
|
533
|
+
def test_group
|
534
|
+
@@db.drop_collection("test")
|
535
|
+
test = @@db.collection("test")
|
536
|
+
|
537
|
+
assert_equal [], test.group([], {}, {"count" => 0}, "function (obj, prev) { prev.count++; }")
|
538
|
+
|
539
|
+
test.insert("a" => 2)
|
540
|
+
test.insert("b" => 5)
|
541
|
+
test.insert("a" => 1)
|
542
|
+
|
543
|
+
assert_equal 3, test.group([], {}, {"count" => 0}, "function (obj, prev) { prev.count++; }")[0]["count"]
|
544
|
+
assert_equal 1, test.group([], {"a" => {"$gt" => 1}}, {"count" => 0}, "function (obj, prev) { prev.count++; }")[0]["count"]
|
545
|
+
end
|
546
|
+
|
547
|
+
def test_deref
|
548
|
+
@@coll.clear
|
549
|
+
|
550
|
+
assert_equal nil, @@db.dereference(DBRef.new("test", ObjectID.new))
|
551
|
+
obj = {"x" => true}
|
552
|
+
key = @@coll.insert(obj)["_id"]
|
553
|
+
assert_equal true, @@db.dereference(DBRef.new("test", key))["x"]
|
554
|
+
|
555
|
+
assert_equal nil, @@db.dereference(DBRef.new("test", 4))
|
556
|
+
obj = {"_id" => 4}
|
557
|
+
@@coll.insert(obj)
|
558
|
+
assert_equal obj, @@db.dereference(DBRef.new("test", 4))
|
559
|
+
end
|
560
|
+
|
525
561
|
# TODO this test fails with error message "Undefed Before end of object"
|
526
562
|
# That is a database error. The undefined type may go away.
|
527
563
|
|