mongoid 1.1.4 → 1.2.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.
- data/HISTORY +69 -1
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/lib/mongoid.rb +39 -13
- data/lib/mongoid/associations.rb +1 -0
- data/lib/mongoid/associations/has_many.rb +19 -3
- data/lib/mongoid/attributes.rb +6 -1
- data/lib/mongoid/collection.rb +106 -0
- data/lib/mongoid/collections/cyclic_iterator.rb +34 -0
- data/lib/mongoid/collections/master.rb +28 -0
- data/lib/mongoid/collections/mimic.rb +46 -0
- data/lib/mongoid/collections/operations.rb +39 -0
- data/lib/mongoid/collections/slaves.rb +44 -0
- data/lib/mongoid/commands.rb +1 -0
- data/lib/mongoid/config.rb +61 -9
- data/lib/mongoid/contexts/enumerable.rb +24 -15
- data/lib/mongoid/contexts/mongo.rb +25 -31
- data/lib/mongoid/contexts/paging.rb +2 -2
- data/lib/mongoid/criteria.rb +48 -7
- data/lib/mongoid/criterion/exclusion.rb +2 -0
- data/lib/mongoid/criterion/optional.rb +2 -2
- data/lib/mongoid/cursor.rb +82 -0
- data/lib/mongoid/document.rb +12 -13
- data/lib/mongoid/errors.rb +35 -4
- data/lib/mongoid/extensions.rb +1 -0
- data/lib/mongoid/extensions/array/aliasing.rb +4 -0
- data/lib/mongoid/extensions/string/inflections.rb +44 -1
- data/lib/mongoid/factory.rb +17 -0
- data/lib/mongoid/finders.rb +7 -2
- data/lib/mongoid/matchers/default.rb +6 -0
- data/lib/mongoid/matchers/gt.rb +1 -1
- data/lib/mongoid/matchers/gte.rb +1 -1
- data/lib/mongoid/matchers/lt.rb +1 -1
- data/lib/mongoid/matchers/lte.rb +1 -1
- data/mongoid.gemspec +30 -5
- data/perf/benchmark.rb +5 -3
- data/spec/integration/mongoid/associations_spec.rb +12 -0
- data/spec/integration/mongoid/contexts/enumerable_spec.rb +20 -0
- data/spec/integration/mongoid/criteria_spec.rb +28 -0
- data/spec/integration/mongoid/document_spec.rb +1 -1
- data/spec/integration/mongoid/inheritance_spec.rb +2 -2
- data/spec/models/person.rb +1 -1
- data/spec/spec_helper.rb +9 -4
- data/spec/unit/mongoid/associations/has_many_spec.rb +19 -0
- data/spec/unit/mongoid/associations_spec.rb +9 -0
- data/spec/unit/mongoid/attributes_spec.rb +4 -4
- data/spec/unit/mongoid/collection_spec.rb +113 -0
- data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +75 -0
- data/spec/unit/mongoid/collections/master_spec.rb +41 -0
- data/spec/unit/mongoid/collections/mimic_spec.rb +43 -0
- data/spec/unit/mongoid/collections/slaves_spec.rb +81 -0
- data/spec/unit/mongoid/commands_spec.rb +7 -0
- data/spec/unit/mongoid/config_spec.rb +52 -1
- data/spec/unit/mongoid/contexts/enumerable_spec.rb +38 -12
- data/spec/unit/mongoid/contexts/mongo_spec.rb +38 -31
- data/spec/unit/mongoid/criteria_spec.rb +20 -12
- data/spec/unit/mongoid/criterion/exclusion_spec.rb +26 -0
- data/spec/unit/mongoid/criterion/optional_spec.rb +13 -0
- data/spec/unit/mongoid/cursor_spec.rb +74 -0
- data/spec/unit/mongoid/document_spec.rb +4 -5
- data/spec/unit/mongoid/errors_spec.rb +5 -9
- data/spec/unit/mongoid/extensions/string/inflections_spec.rb +21 -2
- data/spec/unit/mongoid/factory_spec.rb +16 -0
- data/spec/unit/mongoid_spec.rb +4 -4
- metadata +28 -3
@@ -0,0 +1,39 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Collections #:nodoc:
|
4
|
+
module Operations #:nodoc:
|
5
|
+
# Constant definining all the read operations available for a
|
6
|
+
# Mongo:Collection. This is used in delegation.
|
7
|
+
READ = [
|
8
|
+
:[],
|
9
|
+
:count,
|
10
|
+
:distinct,
|
11
|
+
:find,
|
12
|
+
:find_one,
|
13
|
+
:group,
|
14
|
+
:index_information,
|
15
|
+
:map_reduce,
|
16
|
+
:mapreduce,
|
17
|
+
:options
|
18
|
+
]
|
19
|
+
|
20
|
+
# Constant definining all the write operations available for a
|
21
|
+
# Mongo:Collection. This is used in delegation.
|
22
|
+
WRITE = [
|
23
|
+
:<<,
|
24
|
+
:create_index,
|
25
|
+
:drop,
|
26
|
+
:drop_index,
|
27
|
+
:drop_indexes,
|
28
|
+
:insert,
|
29
|
+
:remove,
|
30
|
+
:rename,
|
31
|
+
:save,
|
32
|
+
:update
|
33
|
+
]
|
34
|
+
|
35
|
+
# Convenience constant for getting back all collection operations.
|
36
|
+
ALL = (READ + WRITE)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Collections #:nodoc:
|
4
|
+
class Slaves
|
5
|
+
include Mimic
|
6
|
+
|
7
|
+
attr_reader :iterator
|
8
|
+
|
9
|
+
# All read operations should delegate to the slave connections.
|
10
|
+
# These operations mimic the methods on a Mongo:Collection.
|
11
|
+
#
|
12
|
+
# Example:
|
13
|
+
#
|
14
|
+
# <tt>collection.save({ :name => "Al" })</tt>
|
15
|
+
proxy(:collection, Operations::READ)
|
16
|
+
|
17
|
+
# Is the collection of slaves empty or not?
|
18
|
+
#
|
19
|
+
# Return:
|
20
|
+
#
|
21
|
+
# True is the iterator is not set, false if not.
|
22
|
+
def empty?
|
23
|
+
@iterator.nil?
|
24
|
+
end
|
25
|
+
|
26
|
+
# Create the new database reader. Will create a collection from the
|
27
|
+
# slave databases and cycle through them on each read.
|
28
|
+
#
|
29
|
+
# Example:
|
30
|
+
#
|
31
|
+
# <tt>Reader.new(slaves, "mongoid_people")</tt>
|
32
|
+
def initialize(slaves, name)
|
33
|
+
unless slaves.blank?
|
34
|
+
@iterator = CyclicIterator.new(slaves.collect { |db| db.collection(name) })
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
protected
|
39
|
+
def collection
|
40
|
+
@iterator.next
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/mongoid/commands.rb
CHANGED
data/lib/mongoid/config.rb
CHANGED
@@ -5,28 +5,80 @@ module Mongoid #:nodoc
|
|
5
5
|
|
6
6
|
attr_accessor \
|
7
7
|
:allow_dynamic_fields,
|
8
|
+
:max_successive_reads,
|
9
|
+
:reconnect_time,
|
10
|
+
:parameterize_keys,
|
8
11
|
:persist_in_safe_mode,
|
9
12
|
:raise_not_found_error
|
10
13
|
|
11
14
|
# Defaults the configuration options to true.
|
12
15
|
def initialize
|
13
16
|
@allow_dynamic_fields = true
|
17
|
+
@max_successive_reads = 10
|
18
|
+
@parameterize_keys = true
|
14
19
|
@persist_in_safe_mode = true
|
15
20
|
@raise_not_found_error = true
|
21
|
+
@reconnect_time = 3
|
16
22
|
end
|
17
23
|
|
18
|
-
# Sets the Mongo::DB to be used.
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
+
# Sets the Mongo::DB master database to be used. If the object trying to me
|
25
|
+
# set is not a valid +Mongo::DB+, then an error will be raise.
|
26
|
+
#
|
27
|
+
# Example:
|
28
|
+
#
|
29
|
+
# <tt>Config.master = Mongo::Connection.db("test")</tt>
|
30
|
+
#
|
31
|
+
# Returns:
|
32
|
+
#
|
33
|
+
# The Master DB instance.
|
34
|
+
def master=(db)
|
35
|
+
raise Errors::InvalidDatabase.new(db) unless db.kind_of?(Mongo::DB)
|
36
|
+
@master = db
|
24
37
|
end
|
25
38
|
|
26
|
-
# Returns the
|
27
|
-
|
28
|
-
|
39
|
+
# Returns the master database, or if none has been set it will raise an
|
40
|
+
# error.
|
41
|
+
#
|
42
|
+
# Example:
|
43
|
+
#
|
44
|
+
# <tt>Config.master</tt>
|
45
|
+
#
|
46
|
+
# Returns:
|
47
|
+
#
|
48
|
+
# The master +Mongo::DB+
|
49
|
+
def master
|
50
|
+
@master || (raise Errors::InvalidDatabase.new(nil))
|
29
51
|
end
|
30
52
|
|
53
|
+
alias :database :master
|
54
|
+
alias :database= :master=
|
55
|
+
|
56
|
+
# Sets the Mongo::DB slave databases to be used. If the objects trying to me
|
57
|
+
# set are not valid +Mongo::DBs+, then an error will be raise.
|
58
|
+
#
|
59
|
+
# Example:
|
60
|
+
#
|
61
|
+
# <tt>Config.slaves = [ Mongo::Connection.db("test") ]</tt>
|
62
|
+
#
|
63
|
+
# Returns:
|
64
|
+
#
|
65
|
+
# The slaves DB instances.
|
66
|
+
def slaves=(dbs)
|
67
|
+
dbs.each { |db| raise Errors::InvalidDatabase.new(db) unless db.kind_of?(Mongo::DB) }
|
68
|
+
@slaves = dbs
|
69
|
+
end
|
70
|
+
|
71
|
+
# Returns the slave databases, or if none has been set nil
|
72
|
+
#
|
73
|
+
# Example:
|
74
|
+
#
|
75
|
+
# <tt>Config.slaves</tt>
|
76
|
+
#
|
77
|
+
# Returns:
|
78
|
+
#
|
79
|
+
# The slave +Mongo::DBs+
|
80
|
+
def slaves
|
81
|
+
@slaves
|
82
|
+
end
|
31
83
|
end
|
32
84
|
end
|
@@ -5,7 +5,7 @@ module Mongoid #:nodoc:
|
|
5
5
|
include Paging
|
6
6
|
attr_reader :selector, :options, :documents
|
7
7
|
|
8
|
-
delegate :first, :last, :to => :
|
8
|
+
delegate :first, :last, :to => :execute
|
9
9
|
|
10
10
|
# Return aggregation counts of the grouped documents. This will count by
|
11
11
|
# the first field provided in the fields array.
|
@@ -21,7 +21,7 @@ module Mongoid #:nodoc:
|
|
21
21
|
|
22
22
|
# Gets the number of documents in the array. Delegates to size.
|
23
23
|
def count
|
24
|
-
@documents.size
|
24
|
+
@count ||= @documents.size
|
25
25
|
end
|
26
26
|
|
27
27
|
# Groups the documents by the first field supplied in the field options.
|
@@ -40,8 +40,8 @@ module Mongoid #:nodoc:
|
|
40
40
|
# Returns:
|
41
41
|
#
|
42
42
|
# An +Array+ of documents that matched the selector.
|
43
|
-
def execute
|
44
|
-
@documents.select { |document| document.matches?(@selector) }
|
43
|
+
def execute(paginating = false)
|
44
|
+
limit(@documents.select { |document| document.matches?(@selector) })
|
45
45
|
end
|
46
46
|
|
47
47
|
# Create the new enumerable context. This will need the selector and
|
@@ -61,10 +61,7 @@ module Mongoid #:nodoc:
|
|
61
61
|
#
|
62
62
|
# The numerical largest value.
|
63
63
|
def max(field)
|
64
|
-
|
65
|
-
value = doc.send(field)
|
66
|
-
(memo && memo >= value) ? memo : value
|
67
|
-
end
|
64
|
+
determine(field, :>=)
|
68
65
|
end
|
69
66
|
|
70
67
|
# Get the smallest value for the field in all the documents.
|
@@ -73,10 +70,7 @@ module Mongoid #:nodoc:
|
|
73
70
|
#
|
74
71
|
# The numerical smallest value.
|
75
72
|
def min(field)
|
76
|
-
|
77
|
-
value = doc.send(field)
|
78
|
-
(memo && memo <= value) ? memo : value
|
79
|
-
end
|
73
|
+
determine(field, :<=)
|
80
74
|
end
|
81
75
|
|
82
76
|
# Get one document.
|
@@ -84,9 +78,7 @@ module Mongoid #:nodoc:
|
|
84
78
|
# Returns:
|
85
79
|
#
|
86
80
|
# The first document in the +Array+
|
87
|
-
|
88
|
-
@documents.first
|
89
|
-
end
|
81
|
+
alias :one :first
|
90
82
|
|
91
83
|
# Get the sum of the field values for all the documents.
|
92
84
|
#
|
@@ -100,6 +92,23 @@ module Mongoid #:nodoc:
|
|
100
92
|
end
|
101
93
|
end
|
102
94
|
|
95
|
+
protected
|
96
|
+
# If the field exists, perform the comparison and set if true.
|
97
|
+
def determine(field, operator)
|
98
|
+
matching = @documents.inject(nil) do |memo, doc|
|
99
|
+
value = doc.send(field)
|
100
|
+
(memo && memo.send(operator, value)) ? memo : value
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
# Limits the result set if skip and limit options.
|
105
|
+
def limit(documents)
|
106
|
+
skip, limit = @options[:skip], @options[:limit]
|
107
|
+
if skip && limit
|
108
|
+
return documents.slice(skip, limit)
|
109
|
+
end
|
110
|
+
documents
|
111
|
+
end
|
103
112
|
end
|
104
113
|
end
|
105
114
|
end
|
@@ -35,6 +35,28 @@ module Mongoid #:nodoc:
|
|
35
35
|
@count ||= @klass.collection.find(@selector, process_options).count
|
36
36
|
end
|
37
37
|
|
38
|
+
# Execute the context. This will take the selector and options
|
39
|
+
# and pass them on to the Ruby driver's +find()+ method on the collection. The
|
40
|
+
# collection itself will be retrieved from the class provided, and once the
|
41
|
+
# query has returned new documents of the type of class provided will be instantiated.
|
42
|
+
#
|
43
|
+
# Example:
|
44
|
+
#
|
45
|
+
# <tt>mongo.execute</tt>
|
46
|
+
#
|
47
|
+
# Returns:
|
48
|
+
#
|
49
|
+
# An enumerable +Cursor+.
|
50
|
+
def execute(paginating = false)
|
51
|
+
cursor = @klass.collection.find(@selector, process_options)
|
52
|
+
if cursor
|
53
|
+
@count = cursor.count if paginating
|
54
|
+
cursor
|
55
|
+
else
|
56
|
+
[]
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
38
60
|
GROUP_REDUCE = "function(obj, prev) { prev.group.push(obj); }"
|
39
61
|
# Groups the context. This will take the internally built selector and options
|
40
62
|
# and pass them on to the Ruby driver's +group()+ method on the collection. The
|
@@ -57,34 +79,12 @@ module Mongoid #:nodoc:
|
|
57
79
|
true
|
58
80
|
).collect do |docs|
|
59
81
|
docs["group"] = docs["group"].collect do |attrs|
|
60
|
-
|
82
|
+
Mongoid::Factory.build(attrs)
|
61
83
|
end
|
62
84
|
docs
|
63
85
|
end
|
64
86
|
end
|
65
87
|
|
66
|
-
# Execute the context. This will take the selector and options
|
67
|
-
# and pass them on to the Ruby driver's +find()+ method on the collection. The
|
68
|
-
# collection itself will be retrieved from the class provided, and once the
|
69
|
-
# query has returned new documents of the type of class provided will be instantiated.
|
70
|
-
#
|
71
|
-
# Example:
|
72
|
-
#
|
73
|
-
# <tt>mongo.execute</tt>
|
74
|
-
#
|
75
|
-
# Returns:
|
76
|
-
#
|
77
|
-
# An +Array+ of documents
|
78
|
-
def execute
|
79
|
-
attributes = @klass.collection.find(@selector, process_options)
|
80
|
-
if attributes
|
81
|
-
@count = attributes.count
|
82
|
-
attributes.collect { |doc| instantiate(doc) }
|
83
|
-
else
|
84
|
-
[]
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
88
|
# Create the new mongo context. This will execute the queries given the
|
89
89
|
# selector and options against the database.
|
90
90
|
#
|
@@ -115,7 +115,7 @@ module Mongoid #:nodoc:
|
|
115
115
|
sorting = [[:_id, :asc]] unless sorting
|
116
116
|
opts[:sort] = sorting.collect { |option| [ option[0], option[1].invert ] }
|
117
117
|
attributes = @klass.collection.find_one(@selector, opts)
|
118
|
-
attributes ?
|
118
|
+
attributes ? Mongoid::Factory.build(attributes) : nil
|
119
119
|
end
|
120
120
|
|
121
121
|
MAX_REDUCE = "function(obj, prev) { if (prev.max == 'start') { prev.max = obj.[field]; } " +
|
@@ -169,7 +169,7 @@ module Mongoid #:nodoc:
|
|
169
169
|
# The first document in the collection.
|
170
170
|
def one
|
171
171
|
attributes = @klass.collection.find_one(@selector, process_options)
|
172
|
-
attributes ?
|
172
|
+
attributes ? Mongoid::Factory.build(attributes) : nil
|
173
173
|
end
|
174
174
|
|
175
175
|
alias :first :one
|
@@ -193,7 +193,6 @@ module Mongoid #:nodoc:
|
|
193
193
|
grouped(:sum, field.to_s, SUM_REDUCE)
|
194
194
|
end
|
195
195
|
|
196
|
-
protected
|
197
196
|
# Common functionality for grouping operations. Currently used by min, max
|
198
197
|
# and sum. Will gsub the field name in the supplied reduce function.
|
199
198
|
def grouped(start, field, reduce)
|
@@ -207,11 +206,6 @@ module Mongoid #:nodoc:
|
|
207
206
|
collection.first[start.to_s]
|
208
207
|
end
|
209
208
|
|
210
|
-
# If hereditary instantiate by _type otherwise use the klass.
|
211
|
-
def instantiate(attrs)
|
212
|
-
@hereditary ? attrs["_type"].constantize.instantiate(attrs) : @klass.instantiate(attrs)
|
213
|
-
end
|
214
|
-
|
215
209
|
# Filters the field list. If no fields have been supplied, then it will be
|
216
210
|
# empty. If fields have been defined then _type will be included as well.
|
217
211
|
def process_options
|
@@ -12,9 +12,9 @@ module Mongoid #:nodoc:
|
|
12
12
|
#
|
13
13
|
# A collection of documents paginated.
|
14
14
|
def paginate
|
15
|
-
@collection ||= execute
|
15
|
+
@collection ||= execute(true)
|
16
16
|
WillPaginate::Collection.create(page, per_page, count) do |pager|
|
17
|
-
pager.replace(@collection)
|
17
|
+
pager.replace(@collection.to_a)
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
data/lib/mongoid/criteria.rb
CHANGED
@@ -25,8 +25,9 @@ module Mongoid #:nodoc:
|
|
25
25
|
include Criterion::Optional
|
26
26
|
include Enumerable
|
27
27
|
|
28
|
+
attr_reader :collection, :ids, :klass, :options, :selector
|
29
|
+
|
28
30
|
attr_accessor :documents
|
29
|
-
attr_reader :klass, :options, :selector
|
30
31
|
|
31
32
|
delegate \
|
32
33
|
:aggregate,
|
@@ -46,13 +47,13 @@ module Mongoid #:nodoc:
|
|
46
47
|
# Concatinate the criteria with another enumerable. If the other is a
|
47
48
|
# +Criteria+ then it needs to get the collection from it.
|
48
49
|
def +(other)
|
49
|
-
entries + (other
|
50
|
+
entries + comparable(other)
|
50
51
|
end
|
51
52
|
|
52
53
|
# Returns the difference between the criteria and another enumerable. If
|
53
54
|
# the other is a +Criteria+ then it needs to get the collection from it.
|
54
55
|
def -(other)
|
55
|
-
entries - (other
|
56
|
+
entries - comparable(other)
|
56
57
|
end
|
57
58
|
|
58
59
|
# Returns true if the supplied +Enumerable+ or +Criteria+ is equal to the results
|
@@ -69,7 +70,7 @@ module Mongoid #:nodoc:
|
|
69
70
|
self.selector == other.selector && self.options == other.options
|
70
71
|
when Enumerable
|
71
72
|
@collection ||= execute
|
72
|
-
return (@collection == other)
|
73
|
+
return (@collection.collect == other)
|
73
74
|
else
|
74
75
|
return false
|
75
76
|
end
|
@@ -108,7 +109,11 @@ module Mongoid #:nodoc:
|
|
108
109
|
# <tt>criteria.each { |doc| p doc }</tt>
|
109
110
|
def each(&block)
|
110
111
|
@collection ||= execute
|
111
|
-
block_given?
|
112
|
+
if block_given?
|
113
|
+
docs = []
|
114
|
+
@collection.each { |doc| docs << doc; yield doc }
|
115
|
+
end
|
116
|
+
self
|
112
117
|
end
|
113
118
|
|
114
119
|
# Create the new +Criteria+ object. This will initialize the selector
|
@@ -219,7 +224,18 @@ module Mongoid #:nodoc:
|
|
219
224
|
end
|
220
225
|
|
221
226
|
protected
|
222
|
-
# Determines the context to be used for this criteria.
|
227
|
+
# Determines the context to be used for this criteria. If the class is an
|
228
|
+
# embedded document, then thw context will be the array in the has_many
|
229
|
+
# association it is in. If the class is a root, then the database itself
|
230
|
+
# will be the context.
|
231
|
+
#
|
232
|
+
# Example:
|
233
|
+
#
|
234
|
+
# <tt>criteria#determine_context</tt>
|
235
|
+
#
|
236
|
+
# Returns:
|
237
|
+
#
|
238
|
+
# A enumerable or mongo context.
|
223
239
|
def determine_context
|
224
240
|
if @klass.embedded
|
225
241
|
return Contexts::Enumerable.new(@selector, @options, @documents)
|
@@ -230,6 +246,12 @@ module Mongoid #:nodoc:
|
|
230
246
|
# Filters the unused options out of the options +Hash+. Currently this
|
231
247
|
# takes into account the "page" and "per_page" options that would be passed
|
232
248
|
# in if using will_paginate.
|
249
|
+
#
|
250
|
+
# Example:
|
251
|
+
#
|
252
|
+
# Given a criteria with a selector of { :page => 1, :per_page => 40 }
|
253
|
+
#
|
254
|
+
# <tt>criteria.filter_options</tt> # selector: { :skip => 0, :limit => 40 }
|
233
255
|
def filter_options
|
234
256
|
page_num = @options.delete(:page)
|
235
257
|
per_page_num = @options.delete(:per_page)
|
@@ -239,14 +261,33 @@ module Mongoid #:nodoc:
|
|
239
261
|
end
|
240
262
|
end
|
241
263
|
|
264
|
+
# Return the entries of the other criteria or the object. Used for
|
265
|
+
# comparing criteria or an enumerable.
|
266
|
+
def comparable(other)
|
267
|
+
other.is_a?(Criteria) ? other.entries : other
|
268
|
+
end
|
269
|
+
|
242
270
|
# Update the selector setting the operator on the value for each key in the
|
243
271
|
# supplied attributes +Hash+.
|
272
|
+
#
|
273
|
+
# Example:
|
274
|
+
#
|
275
|
+
# <tt>criteria.update_selector({ :field => "value" }, "$in")</tt>
|
244
276
|
def update_selector(attributes, operator)
|
245
277
|
attributes.each { |key, value| @selector[key] = { operator => value } }; self
|
246
278
|
end
|
247
279
|
|
248
280
|
class << self
|
249
|
-
#
|
281
|
+
# Create a criteria or single document based on an id search. Will handle
|
282
|
+
# if a single id has been passed or mulitple ids.
|
283
|
+
#
|
284
|
+
# Example:
|
285
|
+
#
|
286
|
+
# Criteria.id_criteria(Person, [1, 2, 3])
|
287
|
+
#
|
288
|
+
# Returns:
|
289
|
+
#
|
290
|
+
# The single or multiple documents.
|
250
291
|
def id_criteria(klass, params)
|
251
292
|
criteria = new(klass).id(params)
|
252
293
|
result = params.is_a?(String) ? criteria.one : criteria.entries
|