mongoid 5.4.1 → 6.0.0.beta
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/config/locales/en.yml +23 -16
- data/lib/mongoid.rb +4 -9
- data/lib/mongoid/atomic.rb +1 -1
- data/lib/mongoid/atomic/modifiers.rb +8 -12
- data/lib/mongoid/attributes.rb +9 -11
- data/lib/mongoid/attributes/dynamic.rb +5 -6
- data/lib/mongoid/attributes/nested.rb +1 -1
- data/lib/mongoid/attributes/processing.rb +4 -0
- data/lib/mongoid/attributes/readonly.rb +22 -0
- data/lib/mongoid/cacheable.rb +36 -0
- data/lib/mongoid/changeable.rb +37 -1
- data/lib/mongoid/clients.rb +0 -63
- data/lib/mongoid/clients/factory.rb +0 -2
- data/lib/mongoid/clients/options.rb +54 -249
- data/lib/mongoid/clients/storage_options.rb +1 -69
- data/lib/mongoid/composable.rb +26 -2
- data/lib/mongoid/config.rb +1 -1
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/contextual/aggregable/mongo.rb +1 -0
- data/lib/mongoid/contextual/atomic.rb +6 -9
- data/lib/mongoid/contextual/geo_near.rb +2 -3
- data/lib/mongoid/contextual/map_reduce.rb +97 -24
- data/lib/mongoid/contextual/memory.rb +7 -4
- data/lib/mongoid/contextual/mongo.rb +63 -54
- data/lib/mongoid/contextual/none.rb +2 -2
- data/lib/mongoid/copyable.rb +19 -19
- data/lib/mongoid/criteria.rb +5 -4
- data/lib/mongoid/criteria/findable.rb +2 -3
- data/lib/mongoid/criteria/includable.rb +63 -16
- data/lib/mongoid/criteria/marshalable.rb +2 -2
- data/lib/mongoid/criteria/modifiable.rb +17 -1
- data/lib/mongoid/criteria/options.rb +25 -0
- data/lib/mongoid/criteria/queryable.rb +86 -0
- data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
- data/lib/mongoid/criteria/queryable/extensions.rb +28 -0
- data/lib/mongoid/criteria/queryable/extensions/array.rb +185 -0
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +37 -0
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +34 -0
- data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +53 -0
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +200 -0
- data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +86 -0
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +90 -0
- data/lib/mongoid/criteria/queryable/extensions/object.rb +206 -0
- data/lib/mongoid/criteria/queryable/extensions/range.rb +70 -0
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +45 -0
- data/lib/mongoid/criteria/queryable/extensions/set.rb +34 -0
- data/lib/mongoid/criteria/queryable/extensions/string.rb +137 -0
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +79 -0
- data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +54 -0
- data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
- data/lib/mongoid/criteria/queryable/key.rb +103 -0
- data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
- data/lib/mongoid/criteria/queryable/mergeable.rb +271 -0
- data/lib/mongoid/criteria/queryable/optional.rb +411 -0
- data/lib/mongoid/criteria/queryable/options.rb +136 -0
- data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
- data/lib/mongoid/criteria/queryable/selectable.rb +662 -0
- data/lib/mongoid/criteria/queryable/selector.rb +196 -0
- data/lib/mongoid/criteria/queryable/smash.rb +103 -0
- data/lib/mongoid/document.rb +9 -23
- data/lib/mongoid/errors.rb +2 -1
- data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
- data/lib/mongoid/errors/delete_restriction.rb +2 -2
- data/lib/mongoid/errors/invalid_field.rb +2 -2
- data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
- data/lib/mongoid/errors/invalid_relation.rb +66 -0
- data/lib/mongoid/errors/inverse_not_found.rb +1 -1
- data/lib/mongoid/errors/mongoid_error.rb +1 -1
- data/lib/mongoid/evolvable.rb +1 -1
- data/lib/mongoid/extensions.rb +0 -5
- data/lib/mongoid/extensions/big_decimal.rb +17 -8
- data/lib/mongoid/extensions/date.rb +4 -1
- data/lib/mongoid/extensions/hash.rb +2 -3
- data/lib/mongoid/extensions/object.rb +2 -2
- data/lib/mongoid/extensions/string.rb +4 -3
- data/lib/mongoid/extensions/time.rb +5 -2
- data/lib/mongoid/factory.rb +1 -0
- data/lib/mongoid/fields/foreign_key.rb +2 -2
- data/lib/mongoid/fields/localized.rb +3 -8
- data/lib/mongoid/fields/validators/macro.rb +18 -0
- data/lib/mongoid/findable.rb +3 -3
- data/lib/mongoid/indexable.rb +17 -16
- data/lib/mongoid/indexable/specification.rb +1 -1
- data/lib/mongoid/indexable/validators/options.rb +1 -2
- data/lib/mongoid/interceptable.rb +6 -17
- data/lib/mongoid/loggable.rb +1 -1
- data/lib/mongoid/matchable.rb +3 -10
- data/lib/mongoid/matchable/gt.rb +2 -0
- data/lib/mongoid/matchable/gte.rb +2 -0
- data/lib/mongoid/matchable/lt.rb +2 -0
- data/lib/mongoid/matchable/lte.rb +2 -0
- data/lib/mongoid/persistable.rb +6 -5
- data/lib/mongoid/persistable/creatable.rb +2 -0
- data/lib/mongoid/persistable/deletable.rb +7 -3
- data/lib/mongoid/persistable/settable.rb +3 -16
- data/lib/mongoid/persistable/updatable.rb +10 -12
- data/lib/mongoid/persistence_context.rb +216 -0
- data/lib/mongoid/query_cache.rb +5 -30
- data/lib/mongoid/relations/accessors.rb +6 -2
- data/lib/mongoid/relations/auto_save.rb +12 -4
- data/lib/mongoid/relations/bindings/embedded/in.rb +4 -0
- data/lib/mongoid/relations/bindings/embedded/many.rb +8 -1
- data/lib/mongoid/relations/bindings/embedded/one.rb +10 -0
- data/lib/mongoid/relations/bindings/referenced/many.rb +4 -0
- data/lib/mongoid/relations/builders.rb +2 -2
- data/lib/mongoid/relations/builders/embedded/one.rb +1 -1
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +1 -1
- data/lib/mongoid/relations/conversions.rb +1 -1
- data/lib/mongoid/relations/counter_cache.rb +28 -18
- data/lib/mongoid/relations/eager.rb +19 -7
- data/lib/mongoid/relations/eager/base.rb +5 -5
- data/lib/mongoid/relations/embedded/batchable.rb +9 -33
- data/lib/mongoid/relations/embedded/in.rb +16 -2
- data/lib/mongoid/relations/embedded/many.rb +23 -8
- data/lib/mongoid/relations/embedded/one.rb +17 -2
- data/lib/mongoid/relations/macros.rb +9 -2
- data/lib/mongoid/relations/metadata.rb +3 -3
- data/lib/mongoid/relations/nested_builder.rb +1 -1
- data/lib/mongoid/relations/options.rb +2 -2
- data/lib/mongoid/relations/proxy.rb +2 -33
- data/lib/mongoid/relations/referenced/in.rb +23 -11
- data/lib/mongoid/relations/referenced/many.rb +24 -16
- data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
- data/lib/mongoid/relations/referenced/one.rb +17 -1
- data/lib/mongoid/relations/reflections.rb +3 -5
- data/lib/mongoid/relations/touchable.rb +1 -1
- data/lib/mongoid/reloadable.rb +1 -1
- data/lib/mongoid/scopable.rb +3 -3
- data/lib/mongoid/serializable.rb +2 -3
- data/lib/mongoid/tasks/database.rb +1 -2
- data/lib/mongoid/threaded.rb +4 -4
- data/lib/mongoid/traversable.rb +1 -1
- data/lib/mongoid/validatable.rb +1 -1
- data/lib/mongoid/validatable/macros.rb +2 -4
- data/lib/mongoid/validatable/uniqueness.rb +1 -2
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -7
- data/spec/app/models/album.rb +5 -1
- data/spec/app/models/artist.rb +21 -0
- data/spec/app/models/band.rb +0 -1
- data/spec/app/models/church.rb +0 -2
- data/spec/app/models/ordered_post.rb +5 -0
- data/spec/app/models/oscar.rb +1 -2
- data/spec/app/models/person.rb +3 -1
- data/spec/app/models/post.rb +0 -1
- data/spec/app/models/princess.rb +2 -0
- data/spec/app/models/record.rb +1 -0
- data/spec/app/models/thing.rb +1 -1
- data/spec/config/mongoid.yml +1 -5
- data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
- data/spec/mongoid/atomic_spec.rb +17 -17
- data/spec/mongoid/attributes/nested_spec.rb +14 -14
- data/spec/mongoid/attributes/readonly_spec.rb +87 -44
- data/spec/mongoid/attributes_spec.rb +63 -0
- data/spec/mongoid/cacheable_spec.rb +112 -0
- data/spec/mongoid/changeable_spec.rb +58 -0
- data/spec/mongoid/clients/factory_spec.rb +3 -11
- data/spec/mongoid/clients/options_spec.rb +378 -96
- data/spec/mongoid/clients_spec.rb +207 -170
- data/spec/mongoid/composable_spec.rb +7 -0
- data/spec/mongoid/config_spec.rb +41 -21
- data/spec/mongoid/contextual/atomic_spec.rb +77 -343
- data/spec/mongoid/contextual/map_reduce_spec.rb +119 -111
- data/spec/mongoid/contextual/memory_spec.rb +56 -316
- data/spec/mongoid/contextual/mongo_spec.rb +104 -378
- data/spec/mongoid/copyable_spec.rb +8 -15
- data/spec/mongoid/criteria/modifiable_spec.rb +239 -7
- data/spec/mongoid/criteria/options_spec.rb +29 -0
- data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
- data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
- data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
- data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
- data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
- data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
- data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
- data/spec/mongoid/{extensions/origin/regexp_raw_spec.rb → criteria/queryable/extensions/regexp_spec.rb} +21 -20
- data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
- data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
- data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
- data/spec/mongoid/criteria/queryable/optional_spec.rb +1786 -0
- data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
- data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +4159 -0
- data/spec/mongoid/criteria/queryable/selector_spec.rb +778 -0
- data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
- data/spec/mongoid/criteria_spec.rb +45 -63
- data/spec/mongoid/document_spec.rb +21 -88
- data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
- data/spec/mongoid/extensions/big_decimal_spec.rb +320 -18
- data/spec/mongoid/extensions/date_spec.rb +2 -6
- data/spec/mongoid/extensions/date_time_spec.rb +2 -6
- data/spec/mongoid/extensions/float_spec.rb +8 -1
- data/spec/mongoid/extensions/integer_spec.rb +8 -1
- data/spec/mongoid/extensions/object_spec.rb +11 -0
- data/spec/mongoid/extensions/string_spec.rb +21 -0
- data/spec/mongoid/extensions/time_spec.rb +4 -8
- data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
- data/spec/mongoid/fields/localized_spec.rb +0 -91
- data/spec/mongoid/findable_spec.rb +46 -1
- data/spec/mongoid/indexable_spec.rb +6 -46
- data/spec/mongoid/interceptable_spec.rb +49 -10
- data/spec/mongoid/matchable/gt_spec.rb +11 -0
- data/spec/mongoid/matchable/gte_spec.rb +10 -0
- data/spec/mongoid/matchable/lt_spec.rb +11 -0
- data/spec/mongoid/matchable/lte_spec.rb +11 -0
- data/spec/mongoid/matchable_spec.rb +1 -51
- data/spec/mongoid/persistable/creatable_spec.rb +2 -2
- data/spec/mongoid/persistable/deletable_spec.rb +1 -1
- data/spec/mongoid/persistable/destroyable_spec.rb +6 -2
- data/spec/mongoid/persistable/savable_spec.rb +30 -30
- data/spec/mongoid/persistable/settable_spec.rb +0 -185
- data/spec/mongoid/persistable/updatable_spec.rb +166 -5
- data/spec/mongoid/persistence_context_spec.rb +654 -0
- data/spec/mongoid/positional_spec.rb +10 -10
- data/spec/mongoid/query_cache_spec.rb +89 -65
- data/spec/mongoid/relations/accessors_spec.rb +1 -1
- data/spec/mongoid/relations/auto_save_spec.rb +39 -6
- data/spec/mongoid/relations/builders_spec.rb +37 -10
- data/spec/mongoid/relations/counter_cache_spec.rb +64 -15
- data/spec/mongoid/relations/cyclic_spec.rb +0 -22
- data/spec/mongoid/relations/embedded/many_spec.rb +9 -41
- data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
- data/spec/mongoid/relations/macros_spec.rb +395 -7
- data/spec/mongoid/relations/proxy_spec.rb +3 -1
- data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
- data/spec/mongoid/relations/referenced/many_spec.rb +6 -29
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +6 -29
- data/spec/mongoid/relations/reflections_spec.rb +9 -9
- data/spec/mongoid/reloadable_spec.rb +51 -0
- data/spec/mongoid/scopable_spec.rb +0 -12
- data/spec/mongoid/serializable_spec.rb +0 -50
- data/spec/mongoid/validatable/presence_spec.rb +1 -1
- data/spec/mongoid/validatable/uniqueness_spec.rb +16 -9
- data/spec/mongoid/validatable_spec.rb +16 -0
- data/spec/spec_helper.rb +10 -10
- metadata +536 -479
- metadata.gz.sig +0 -0
- data/lib/mongoid/clients/thread_options.rb +0 -19
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +0 -20
- data/lib/mongoid/extensions/decimal128.rb +0 -39
- data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
- data/lib/mongoid/matchable/regexp.rb +0 -27
- data/spec/app/models/post_genre.rb +0 -6
- data/spec/mongoid/extensions/decimal128_spec.rb +0 -44
- data/spec/mongoid/matchable/regexp_spec.rb +0 -59
data/lib/mongoid/composable.rb
CHANGED
@@ -12,6 +12,7 @@ require "mongoid/scopable"
|
|
12
12
|
require "mongoid/serializable"
|
13
13
|
require "mongoid/shardable"
|
14
14
|
require "mongoid/stateful"
|
15
|
+
require "mongoid/cacheable"
|
15
16
|
require "mongoid/traversable"
|
16
17
|
require "mongoid/validatable"
|
17
18
|
|
@@ -32,7 +33,6 @@ module Mongoid
|
|
32
33
|
include ActiveModel::Model
|
33
34
|
include ActiveModel::ForbiddenAttributesProtection
|
34
35
|
include ActiveModel::Serializers::JSON
|
35
|
-
include ActiveModel::Serializers::Xml
|
36
36
|
include Atomic
|
37
37
|
include Changeable
|
38
38
|
include Clients
|
@@ -50,6 +50,7 @@ module Mongoid
|
|
50
50
|
include Serializable
|
51
51
|
include Shardable
|
52
52
|
include Stateful
|
53
|
+
include Cacheable
|
53
54
|
include Threaded::Lifecycle
|
54
55
|
include Traversable
|
55
56
|
include Validatable
|
@@ -76,6 +77,7 @@ module Mongoid
|
|
76
77
|
Clients,
|
77
78
|
Shardable,
|
78
79
|
Stateful,
|
80
|
+
Cacheable,
|
79
81
|
Threaded::Lifecycle,
|
80
82
|
Traversable,
|
81
83
|
Validatable,
|
@@ -84,6 +86,28 @@ module Mongoid
|
|
84
86
|
ActiveModel::Validations
|
85
87
|
]
|
86
88
|
|
89
|
+
# These are methods names defined in included blocks that may conflict
|
90
|
+
# with user-defined relation or field names.
|
91
|
+
# They won't be in the list of Module.instance_methods on which the
|
92
|
+
# #prohibited_methods code below is dependent so we must track them
|
93
|
+
# separately.
|
94
|
+
#
|
95
|
+
# @return [ Array<Symbol> ] A list of reserved method names.
|
96
|
+
#
|
97
|
+
# @since 6.0.0
|
98
|
+
RESERVED_METHOD_NAMES = [ :fields,
|
99
|
+
:aliased_fields,
|
100
|
+
:localized_fields,
|
101
|
+
:index_specifications,
|
102
|
+
:shard_key_fields,
|
103
|
+
:nested_attributes,
|
104
|
+
:readonly_attributes,
|
105
|
+
:storage_options,
|
106
|
+
:cascades,
|
107
|
+
:cyclic,
|
108
|
+
:cache_timestamp_format
|
109
|
+
]
|
110
|
+
|
87
111
|
class << self
|
88
112
|
|
89
113
|
# Get a list of methods that would be a bad idea to define as field names
|
@@ -98,7 +122,7 @@ module Mongoid
|
|
98
122
|
def prohibited_methods
|
99
123
|
@prohibited_methods ||= MODULES.flat_map do |mod|
|
100
124
|
mod.instance_methods.map(&:to_sym)
|
101
|
-
end
|
125
|
+
end + RESERVED_METHOD_NAMES
|
102
126
|
end
|
103
127
|
end
|
104
128
|
end
|
data/lib/mongoid/config.rb
CHANGED
@@ -25,7 +25,7 @@ module Mongoid
|
|
25
25
|
option :use_activesupport_time_zone, default: true
|
26
26
|
option :use_utc, default: false
|
27
27
|
option :log_level, default: :info
|
28
|
-
option :
|
28
|
+
option :belongs_to_required_by_default, default: true
|
29
29
|
|
30
30
|
# Has Mongoid been configured? This is checking that at least a valid
|
31
31
|
# client config exists.
|
@@ -124,6 +124,7 @@ module Mongoid
|
|
124
124
|
def pipeline(field)
|
125
125
|
db_field = "$#{database_field_name(field)}"
|
126
126
|
pipeline = []
|
127
|
+
pipeline << { "$match" => criteria.selector }
|
127
128
|
pipeline << { "$match" => criteria.exists(field => true).selector }
|
128
129
|
pipeline << { "$sort" => criteria.options[:sort] } if criteria.options[:sort]
|
129
130
|
pipeline << { "$skip" => criteria.options[:skip] } if criteria.options[:skip]
|
@@ -106,21 +106,18 @@ module Mongoid
|
|
106
106
|
view.update_many("$push" => collect_operations(pushes))
|
107
107
|
end
|
108
108
|
|
109
|
-
# Perform an atomic $
|
109
|
+
# Perform an atomic $pushAll operation on the matching documents.
|
110
110
|
#
|
111
111
|
# @example Push the values to the matching docs.
|
112
|
-
# context.
|
112
|
+
# context.push(members: [ "Alan", "Fletch" ])
|
113
113
|
#
|
114
114
|
# @param [ Hash ] pushes The operations.
|
115
115
|
#
|
116
116
|
# @return [ nil ] Nil.
|
117
117
|
#
|
118
|
-
# @since
|
119
|
-
def
|
120
|
-
|
121
|
-
ops.merge!(field => { '$each' => elements })
|
122
|
-
end
|
123
|
-
view.update_many("$push" => push_each_updates)
|
118
|
+
# @since 3.0.0
|
119
|
+
def push_all(pushes)
|
120
|
+
view.update_many("$pushAll" => collect_operations(pushes))
|
124
121
|
end
|
125
122
|
|
126
123
|
# Perform an atomic $rename of fields on the matching documents.
|
@@ -160,7 +157,7 @@ module Mongoid
|
|
160
157
|
# @example Unset the field on the matches.
|
161
158
|
# context.unset(:name)
|
162
159
|
#
|
163
|
-
# @param [ String, Symbol, Array ]
|
160
|
+
# @param [ String, Symbol, Array ] fields The name of the fields.
|
164
161
|
#
|
165
162
|
# @return [ nil ] Nil.
|
166
163
|
#
|
@@ -63,10 +63,9 @@ module Mongoid
|
|
63
63
|
# @example Initialize the new map/reduce.
|
64
64
|
# MapReduce.new(criteria, map, reduce)
|
65
65
|
#
|
66
|
-
# @param [ Mongo::Collection ] collection The collection to run the
|
67
|
-
# operation on.
|
68
66
|
# @param [ Criteria ] criteria The Mongoid criteria.
|
69
|
-
# @param [ String ]
|
67
|
+
# @param [ String ] map The map js function.
|
68
|
+
# @param [ String ] reduce The reduce js function.
|
70
69
|
#
|
71
70
|
# @since 3.0.0
|
72
71
|
def initialize(collection, criteria, near)
|
@@ -32,13 +32,12 @@ module Mongoid
|
|
32
32
|
#
|
33
33
|
# @since 3.0.0
|
34
34
|
def each
|
35
|
-
validate_out!
|
36
35
|
if block_given?
|
37
|
-
|
36
|
+
documents.each do |doc|
|
38
37
|
yield doc
|
39
38
|
end
|
40
39
|
else
|
41
|
-
|
40
|
+
to_enum
|
42
41
|
end
|
43
42
|
end
|
44
43
|
|
@@ -65,7 +64,7 @@ module Mongoid
|
|
65
64
|
#
|
66
65
|
# @since 3.0.0
|
67
66
|
def finalize(function)
|
68
|
-
|
67
|
+
command[:finalize] = function
|
69
68
|
self
|
70
69
|
end
|
71
70
|
|
@@ -80,9 +79,10 @@ module Mongoid
|
|
80
79
|
#
|
81
80
|
# @since 3.0.0
|
82
81
|
def initialize(collection, criteria, map, reduce)
|
83
|
-
@collection = collection
|
84
|
-
|
85
|
-
|
82
|
+
@collection, @criteria = collection, criteria
|
83
|
+
command[:mapreduce] = collection.name.to_s
|
84
|
+
command[:map], command[:reduce] = map, reduce
|
85
|
+
apply_criteria_options
|
86
86
|
end
|
87
87
|
|
88
88
|
# Get the number of documents that were input into the map/reduce.
|
@@ -106,12 +106,11 @@ module Mongoid
|
|
106
106
|
#
|
107
107
|
# @since 3.0.0
|
108
108
|
def js_mode
|
109
|
-
|
109
|
+
command[:jsMode] = true
|
110
110
|
self
|
111
111
|
end
|
112
112
|
|
113
113
|
# Specifies where the map/reduce output is to be stored.
|
114
|
-
# Please see MongoDB documentation for supported map reduce options.
|
115
114
|
#
|
116
115
|
# @example Store output in memory.
|
117
116
|
# map_reduce.out(inline: 1)
|
@@ -125,9 +124,6 @@ module Mongoid
|
|
125
124
|
# @example Store output in a collection, reducing existing documents.
|
126
125
|
# map_reduce.out(reduce: "collection_name")
|
127
126
|
#
|
128
|
-
# @example Return results from map reduce.
|
129
|
-
# map_reduce.out(inline: 1)
|
130
|
-
#
|
131
127
|
# @param [ Hash ] location The place to store the results.
|
132
128
|
#
|
133
129
|
# @return [ MapReduce ] The map/reduce object.
|
@@ -138,7 +134,7 @@ module Mongoid
|
|
138
134
|
normalized.update_values do |value|
|
139
135
|
value.is_a?(::Symbol) ? value.to_s : value
|
140
136
|
end
|
141
|
-
|
137
|
+
command[:out] = normalized
|
142
138
|
self
|
143
139
|
end
|
144
140
|
|
@@ -163,12 +159,8 @@ module Mongoid
|
|
163
159
|
#
|
164
160
|
# @since 3.0.0
|
165
161
|
def raw
|
166
|
-
|
167
|
-
cmd = command
|
168
|
-
opts = { read: cmd.delete(:read).options } if cmd[:read]
|
169
|
-
@map_reduce.database.command(cmd, opts || {}).first
|
162
|
+
results
|
170
163
|
end
|
171
|
-
alias :results :raw
|
172
164
|
|
173
165
|
# Execute the map/reduce, returning the raw output.
|
174
166
|
# Useful when you don't care about map/reduce's ouptut.
|
@@ -204,7 +196,7 @@ module Mongoid
|
|
204
196
|
#
|
205
197
|
# @since 3.0.0
|
206
198
|
def scope(object)
|
207
|
-
|
199
|
+
command[:scope] = object
|
208
200
|
self
|
209
201
|
end
|
210
202
|
|
@@ -240,14 +232,95 @@ module Mongoid
|
|
240
232
|
}
|
241
233
|
end
|
242
234
|
|
243
|
-
|
244
|
-
|
235
|
+
private
|
236
|
+
|
237
|
+
# Apply criteria specific options - query, sort, limit.
|
238
|
+
#
|
239
|
+
# @api private
|
240
|
+
#
|
241
|
+
# @example Apply the criteria options
|
242
|
+
# map_reduce.apply_criteria_options
|
243
|
+
#
|
244
|
+
# @return [ nil ] Nothing.
|
245
|
+
#
|
246
|
+
# @since 3.0.0
|
247
|
+
def apply_criteria_options
|
248
|
+
command[:query] = criteria.selector
|
249
|
+
if sort = criteria.options[:sort]
|
250
|
+
command[:sort] = sort
|
251
|
+
end
|
252
|
+
if limit = criteria.options[:limit]
|
253
|
+
command[:limit] = limit
|
254
|
+
end
|
245
255
|
end
|
246
256
|
|
247
|
-
|
257
|
+
# Get the result documents from the map/reduce. If the output was inline
|
258
|
+
# then we grab them from the results key. If the output was a temp
|
259
|
+
# collection then we need to execute a find on that collection.
|
260
|
+
#
|
261
|
+
# @api private
|
262
|
+
#
|
263
|
+
# @example Get the documents.
|
264
|
+
# map_reduce.documents
|
265
|
+
#
|
266
|
+
# @return [ Array, Cursor ] The documents.
|
267
|
+
#
|
268
|
+
# @since 3.0.0
|
269
|
+
def documents
|
270
|
+
return results["results"] if results.has_key?("results")
|
271
|
+
view = client[output_collection].find
|
272
|
+
view.no_cursor_timeout if criteria.options[:timeout] == false
|
273
|
+
view
|
274
|
+
end
|
248
275
|
|
249
|
-
|
250
|
-
|
276
|
+
# Get the collection that the map/reduce results were stored in.
|
277
|
+
#
|
278
|
+
# @api private
|
279
|
+
#
|
280
|
+
# @example Get the output collection.
|
281
|
+
# map_reduce.output_collection
|
282
|
+
#
|
283
|
+
# @return [ Symbol, String ] The output collection.
|
284
|
+
#
|
285
|
+
# @since 3.0.0
|
286
|
+
def output_collection
|
287
|
+
command[:out].values.first
|
288
|
+
end
|
289
|
+
|
290
|
+
# Execute the map/reduce command and get the results.
|
291
|
+
#
|
292
|
+
# @api private
|
293
|
+
#
|
294
|
+
# @example Get the results.
|
295
|
+
# map_reduce.results
|
296
|
+
#
|
297
|
+
# @return [ Hash ] The results of the command.
|
298
|
+
#
|
299
|
+
# @since 3.0.0
|
300
|
+
def results
|
301
|
+
raise Errors::NoMapReduceOutput.new(command) unless command[:out]
|
302
|
+
@results ||= __client__.command(command).first
|
303
|
+
end
|
304
|
+
|
305
|
+
# Get the client with the proper consistency.
|
306
|
+
#
|
307
|
+
# @api private
|
308
|
+
#
|
309
|
+
# @note We can use eventual if the output is set to inline.
|
310
|
+
#
|
311
|
+
# @example Get the client.
|
312
|
+
# map_reduce.__client__
|
313
|
+
#
|
314
|
+
# @return [ Mongo::Client ] The client with consistency set.
|
315
|
+
#
|
316
|
+
# @since 3.0.15
|
317
|
+
def __client__
|
318
|
+
if command[:out][:inline] != 1
|
319
|
+
# @todo: close
|
320
|
+
client.with(read: { mode: :primary })
|
321
|
+
else
|
322
|
+
client
|
323
|
+
end
|
251
324
|
end
|
252
325
|
end
|
253
326
|
end
|
@@ -130,7 +130,9 @@ module Mongoid
|
|
130
130
|
#
|
131
131
|
# @since 3.0.0
|
132
132
|
def first
|
133
|
-
|
133
|
+
doc = documents.first
|
134
|
+
eager_load_one(doc)
|
135
|
+
doc
|
134
136
|
end
|
135
137
|
alias :one :first
|
136
138
|
alias :find_first :first
|
@@ -140,7 +142,7 @@ module Mongoid
|
|
140
142
|
# @example Create the new context.
|
141
143
|
# Memory.new(criteria)
|
142
144
|
#
|
143
|
-
# @param [ Criteria ]
|
145
|
+
# @param [ Criteria ] The criteria.
|
144
146
|
#
|
145
147
|
# @since 3.0.0
|
146
148
|
def initialize(criteria)
|
@@ -163,7 +165,9 @@ module Mongoid
|
|
163
165
|
#
|
164
166
|
# @since 3.0.0
|
165
167
|
def last
|
166
|
-
|
168
|
+
doc = documents.last
|
169
|
+
eager_load_one(doc)
|
170
|
+
doc
|
167
171
|
end
|
168
172
|
|
169
173
|
# Get the length of matching documents in the context.
|
@@ -373,7 +377,6 @@ module Mongoid
|
|
373
377
|
#
|
374
378
|
# @since 3.0.0
|
375
379
|
def apply_options
|
376
|
-
raise Errors::InMemoryCollationNotSupported.new if criteria.options[:collation]
|
377
380
|
skip(criteria.options[:skip]).limit(criteria.options[:limit])
|
378
381
|
end
|
379
382
|
|
@@ -18,18 +18,7 @@ module Mongoid
|
|
18
18
|
# Options constant.
|
19
19
|
#
|
20
20
|
# @since 5.0.0
|
21
|
-
OPTIONS = [ :hint,
|
22
|
-
:limit,
|
23
|
-
:skip,
|
24
|
-
:sort,
|
25
|
-
:batch_size,
|
26
|
-
:max_scan,
|
27
|
-
:snapshot,
|
28
|
-
:comment,
|
29
|
-
:read,
|
30
|
-
:cursor_type,
|
31
|
-
:collation
|
32
|
-
].freeze
|
21
|
+
OPTIONS = [ :hint, :limit, :skip, :sort, :batch_size, :max_scan, :max_time_ms, :snapshot, :comment, :read ].freeze
|
33
22
|
|
34
23
|
# @attribute [r] view The Mongo collection view.
|
35
24
|
attr_reader :view
|
@@ -79,7 +68,9 @@ module Mongoid
|
|
79
68
|
#
|
80
69
|
# @since 3.0.0
|
81
70
|
def delete
|
82
|
-
|
71
|
+
self.count.tap do
|
72
|
+
view.delete_many
|
73
|
+
end
|
83
74
|
end
|
84
75
|
alias :delete_all :delete
|
85
76
|
|
@@ -92,10 +83,11 @@ module Mongoid
|
|
92
83
|
#
|
93
84
|
# @since 3.0.0
|
94
85
|
def destroy
|
95
|
-
|
86
|
+
destroyed = self.count
|
87
|
+
each do |doc|
|
96
88
|
doc.destroy
|
97
|
-
count += 1
|
98
89
|
end
|
90
|
+
destroyed
|
99
91
|
end
|
100
92
|
alias :destroy_all :destroy
|
101
93
|
|
@@ -110,7 +102,9 @@ module Mongoid
|
|
110
102
|
#
|
111
103
|
# @since 3.0.0
|
112
104
|
def distinct(field)
|
113
|
-
view.distinct(klass.database_field_name(field))
|
105
|
+
view.distinct(klass.database_field_name(field)).map do |value|
|
106
|
+
value.class.demongoize(value)
|
107
|
+
end
|
114
108
|
end
|
115
109
|
|
116
110
|
# Iterate over the context. If provided a block, yield to a Mongoid
|
@@ -197,7 +191,7 @@ module Mongoid
|
|
197
191
|
# @example Execute the command.
|
198
192
|
# context.find_one_and_update({ likes: 1 })
|
199
193
|
#
|
200
|
-
# @param [ Hash ]
|
194
|
+
# @param [ Hash ] update The updates.
|
201
195
|
# @param [ Hash ] options The command options.
|
202
196
|
#
|
203
197
|
# @option options [ :before, :after ] :return_document Return the updated document
|
@@ -233,21 +227,27 @@ module Mongoid
|
|
233
227
|
# @example Get the first document.
|
234
228
|
# context.first
|
235
229
|
#
|
236
|
-
# @note
|
237
|
-
#
|
238
|
-
#
|
239
|
-
#
|
240
|
-
#
|
230
|
+
# @note Automatically adding a sort on _id when no other sort is
|
231
|
+
# defined on the criteria has the potential to cause bad performance issues.
|
232
|
+
# If you experience unexpected poor performance when using #first or #last
|
233
|
+
# and have no sort defined on the criteria, use the option { sort: :none }.
|
234
|
+
# Be aware that #first/#last won't guarantee order in this case.
|
235
|
+
#
|
236
|
+
# @param [ Hash ] opts The options for the query returning the first document.
|
237
|
+
#
|
238
|
+
# @option opts [ :none ] :id_sort Don't apply a sort on _id if no other sort
|
239
|
+
# is defined on the criteria.
|
241
240
|
#
|
242
241
|
# @return [ Document ] The first document.
|
243
242
|
#
|
244
243
|
# @since 3.0.0
|
245
|
-
def first
|
244
|
+
def first(opts = {})
|
246
245
|
return documents.first if cached? && cache_loaded?
|
247
246
|
try_cache(:first) do
|
248
|
-
if
|
249
|
-
|
250
|
-
|
247
|
+
if sort = view.sort || ({ _id: 1 } unless opts[:id_sort] == :none)
|
248
|
+
with_eager_loading(view.sort(sort).limit(-1).first)
|
249
|
+
else
|
250
|
+
with_eager_loading(view.limit(-1).first)
|
251
251
|
end
|
252
252
|
end
|
253
253
|
end
|
@@ -260,10 +260,7 @@ module Mongoid
|
|
260
260
|
# @since 4.0.2
|
261
261
|
def find_first
|
262
262
|
return documents.first if cached? && cache_loaded?
|
263
|
-
|
264
|
-
doc = Factory.from_db(klass, raw_doc, criteria.options[:fields])
|
265
|
-
eager_load([doc]).first
|
266
|
-
end
|
263
|
+
with_eager_loading(view.first)
|
267
264
|
end
|
268
265
|
|
269
266
|
# Execute a $geoNear command against the database.
|
@@ -298,7 +295,7 @@ module Mongoid
|
|
298
295
|
# @example Map by some field.
|
299
296
|
# context.map(:field1)
|
300
297
|
#
|
301
|
-
# @
|
298
|
+
# @exmaple Map with block.
|
302
299
|
# context.map(&:field1)
|
303
300
|
#
|
304
301
|
# @param [ Symbol ] field The field name.
|
@@ -308,7 +305,8 @@ module Mongoid
|
|
308
305
|
if block_given?
|
309
306
|
super(&block)
|
310
307
|
else
|
311
|
-
|
308
|
+
field = field.to_sym
|
309
|
+
criteria.only(field).map(&field.to_proc)
|
312
310
|
end
|
313
311
|
end
|
314
312
|
|
@@ -323,7 +321,7 @@ module Mongoid
|
|
323
321
|
# @since 3.0.0
|
324
322
|
def initialize(criteria)
|
325
323
|
@criteria, @klass, @cache = criteria, criteria.klass, criteria.options[:cache]
|
326
|
-
@collection = @klass.
|
324
|
+
@collection = @klass.collection
|
327
325
|
criteria.send(:merge_type_selection)
|
328
326
|
@view = collection.find(criteria.selector)
|
329
327
|
apply_options
|
@@ -336,22 +334,22 @@ module Mongoid
|
|
336
334
|
# @example Get the last document.
|
337
335
|
# context.last
|
338
336
|
#
|
339
|
-
# @note
|
340
|
-
#
|
341
|
-
#
|
342
|
-
#
|
343
|
-
#
|
337
|
+
# @note Automatically adding a sort on _id when no other sort is
|
338
|
+
# defined on the criteria has the potential to cause bad performance issues.
|
339
|
+
# If you experience unexpected poor performance when using #first or #last
|
340
|
+
# and have no sort defined on the criteria, use the option { sort: :none }.
|
341
|
+
# Be aware that #first/#last won't guarantee order in this case.
|
342
|
+
#
|
343
|
+
# @param [ Hash ] opts The options for the query returning the first document.
|
344
344
|
#
|
345
|
-
# @
|
345
|
+
# @option opts [ :none ] :id_sort Don't apply a sort on _id if no other sort
|
346
|
+
# is defined on the criteria.
|
346
347
|
#
|
347
348
|
# @since 3.0.0
|
348
|
-
def last
|
349
|
+
def last(opts = {})
|
349
350
|
try_cache(:last) do
|
350
|
-
with_inverse_sorting do
|
351
|
-
|
352
|
-
doc = Factory.from_db(klass, raw_doc, criteria.options[:fields])
|
353
|
-
eager_load([doc]).first
|
354
|
-
end
|
351
|
+
with_inverse_sorting(opts) do
|
352
|
+
with_eager_loading(view.limit(-1).first)
|
355
353
|
end
|
356
354
|
end
|
357
355
|
end
|
@@ -407,7 +405,7 @@ module Mongoid
|
|
407
405
|
# @note This method will return the raw db values - it performs no custom
|
408
406
|
# serialization.
|
409
407
|
#
|
410
|
-
# @param [ String, Symbol, Array ]
|
408
|
+
# @param [ String, Symbol, Array ] field Fields to pluck.
|
411
409
|
#
|
412
410
|
# @return [ Array<Object, Array> ] The plucked values.
|
413
411
|
#
|
@@ -559,6 +557,12 @@ module Mongoid
|
|
559
557
|
if criteria.options[:timeout] == false
|
560
558
|
@view = view.no_cursor_timeout
|
561
559
|
end
|
560
|
+
if criteria.options[:cursor_type]
|
561
|
+
# @todo: update to use #cursor_type method on view when driver 2.3 is released.
|
562
|
+
# See RUBY-1080
|
563
|
+
@view = view.clone
|
564
|
+
@view.options.merge!(cursor_type: criteria.options[:cursor_type])
|
565
|
+
end
|
562
566
|
end
|
563
567
|
|
564
568
|
# Apply an option.
|
@@ -583,10 +587,10 @@ module Mongoid
|
|
583
587
|
# context.with_inverse_sorting
|
584
588
|
#
|
585
589
|
# @since 3.0.0
|
586
|
-
def with_inverse_sorting
|
590
|
+
def with_inverse_sorting(opts = {})
|
587
591
|
begin
|
588
|
-
if
|
589
|
-
@view = view.sort(Hash[
|
592
|
+
if sort = criteria.options[:sort] || ( { _id: 1 } unless opts[:id_sort] == :none )
|
593
|
+
@view = view.sort(Hash[sort.map{|k, v| [k, -1*v]}])
|
590
594
|
end
|
591
595
|
yield
|
592
596
|
ensure
|
@@ -654,10 +658,15 @@ module Mongoid
|
|
654
658
|
#
|
655
659
|
# @since 3.0.0
|
656
660
|
def documents_for_iteration
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
|
661
|
+
if cached? && !documents.empty?
|
662
|
+
documents
|
663
|
+
elsif eager_loadable?
|
664
|
+
docs = view.map{ |doc| Factory.from_db(klass, doc, criteria.options[:fields]) }
|
665
|
+
eager_load(docs)
|
666
|
+
docs
|
667
|
+
else
|
668
|
+
view
|
669
|
+
end
|
661
670
|
end
|
662
671
|
|
663
672
|
# Yield to the document.
|
@@ -674,7 +683,7 @@ module Mongoid
|
|
674
683
|
# @since 3.0.0
|
675
684
|
def yield_document(document, &block)
|
676
685
|
doc = document.respond_to?(:_id) ?
|
677
|
-
|
686
|
+
document : Factory.from_db(klass, document, criteria.options[:fields])
|
678
687
|
yield(doc)
|
679
688
|
documents.push(doc) if cacheable?
|
680
689
|
end
|