mongoid 7.4.0 → 8.0.1
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/README.md +3 -3
- data/lib/config/locales/en.yml +51 -28
- data/lib/mongoid/association/accessors.rb +32 -3
- data/lib/mongoid/association/bindable.rb +48 -0
- data/lib/mongoid/association/builders.rb +4 -2
- data/lib/mongoid/association/eager_loadable.rb +29 -7
- data/lib/mongoid/association/embedded/batchable.rb +48 -8
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
- data/lib/mongoid/association/embedded/embedded_in.rb +2 -1
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +40 -18
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +21 -2
- data/lib/mongoid/association/macros.rb +22 -1
- data/lib/mongoid/association/many.rb +5 -0
- data/lib/mongoid/association/nested/many.rb +2 -1
- data/lib/mongoid/association/proxy.rb +12 -0
- data/lib/mongoid/association/referenced/auto_save.rb +3 -2
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/belongs_to.rb +1 -1
- data/lib/mongoid/association/referenced/counter_cache.rb +8 -8
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +64 -11
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +4 -1
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +10 -14
- data/lib/mongoid/association/referenced/has_many/proxy.rb +12 -9
- data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/has_one/proxy.rb +8 -11
- data/lib/mongoid/association/referenced/syncable.rb +2 -2
- data/lib/mongoid/association/relatable.rb +38 -4
- data/lib/mongoid/atomic/paths/embedded/many.rb +19 -0
- data/lib/mongoid/attributes/processing.rb +9 -2
- data/lib/mongoid/attributes.rb +30 -27
- data/lib/mongoid/changeable.rb +37 -2
- data/lib/mongoid/clients/options.rb +4 -0
- data/lib/mongoid/clients/sessions.rb +2 -14
- data/lib/mongoid/config/environment.rb +20 -4
- data/lib/mongoid/config.rb +25 -10
- data/lib/mongoid/contextual/aggregable/memory.rb +23 -15
- data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
- data/lib/mongoid/contextual/map_reduce.rb +2 -2
- data/lib/mongoid/contextual/memory.rb +176 -17
- data/lib/mongoid/contextual/mongo.rb +226 -206
- data/lib/mongoid/contextual/none.rb +66 -4
- data/lib/mongoid/copyable.rb +32 -8
- data/lib/mongoid/criteria/includable.rb +24 -20
- data/lib/mongoid/criteria/marshalable.rb +10 -2
- data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -13
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +0 -14
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
- data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -1
- data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
- data/lib/mongoid/criteria/queryable/mergeable.rb +21 -0
- data/lib/mongoid/criteria/queryable/optional.rb +3 -9
- data/lib/mongoid/criteria/queryable/options.rb +1 -1
- data/lib/mongoid/criteria/queryable/selectable.rb +28 -34
- data/lib/mongoid/criteria/queryable/selector.rb +89 -4
- data/lib/mongoid/criteria/queryable/smash.rb +39 -6
- data/lib/mongoid/criteria/queryable.rb +11 -6
- data/lib/mongoid/criteria.rb +1 -26
- data/lib/mongoid/deprecable.rb +36 -0
- data/lib/mongoid/deprecation.rb +25 -0
- data/lib/mongoid/document.rb +96 -32
- data/lib/mongoid/errors/document_not_found.rb +29 -8
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
- data/lib/mongoid/errors/invalid_field.rb +5 -1
- data/lib/mongoid/errors/invalid_field_type.rb +26 -0
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
- data/lib/mongoid/errors.rb +2 -2
- data/lib/mongoid/extensions/array.rb +8 -6
- data/lib/mongoid/extensions/big_decimal.rb +29 -10
- data/lib/mongoid/extensions/binary.rb +42 -0
- data/lib/mongoid/extensions/boolean.rb +8 -2
- data/lib/mongoid/extensions/date.rb +26 -20
- data/lib/mongoid/extensions/date_time.rb +1 -1
- data/lib/mongoid/extensions/float.rb +4 -5
- data/lib/mongoid/extensions/hash.rb +12 -5
- data/lib/mongoid/extensions/integer.rb +4 -5
- data/lib/mongoid/extensions/object.rb +2 -0
- data/lib/mongoid/extensions/range.rb +41 -10
- data/lib/mongoid/extensions/regexp.rb +11 -4
- data/lib/mongoid/extensions/set.rb +11 -4
- data/lib/mongoid/extensions/string.rb +2 -13
- data/lib/mongoid/extensions/symbol.rb +3 -14
- data/lib/mongoid/extensions/time.rb +27 -16
- data/lib/mongoid/extensions/time_with_zone.rb +1 -2
- data/lib/mongoid/extensions.rb +1 -0
- data/lib/mongoid/factory.rb +42 -7
- data/lib/mongoid/fields/foreign_key.rb +7 -0
- data/lib/mongoid/fields/validators/macro.rb +3 -9
- data/lib/mongoid/fields.rb +194 -28
- data/lib/mongoid/findable.rb +27 -7
- data/lib/mongoid/indexable/specification.rb +1 -1
- data/lib/mongoid/indexable/validators/options.rb +4 -1
- data/lib/mongoid/interceptable.rb +69 -9
- data/lib/mongoid/persistable/creatable.rb +14 -5
- data/lib/mongoid/persistable/updatable.rb +12 -5
- data/lib/mongoid/persistable/upsertable.rb +1 -1
- data/lib/mongoid/persistence_context.rb +19 -2
- data/lib/mongoid/query_cache.rb +6 -258
- data/lib/mongoid/railties/controller_runtime.rb +1 -1
- data/lib/mongoid/reloadable.rb +7 -3
- data/lib/mongoid/selectable.rb +1 -2
- data/lib/mongoid/stateful.rb +27 -1
- data/lib/mongoid/timestamps/created.rb +1 -1
- data/lib/mongoid/timestamps/updated.rb +1 -1
- data/lib/mongoid/touchable.rb +2 -3
- data/lib/mongoid/traversable.rb +5 -1
- data/lib/mongoid/validatable/uniqueness.rb +2 -1
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/warnings.rb +28 -0
- data/lib/mongoid.rb +2 -0
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +11 -5
- data/spec/config/mongoid.yml +16 -0
- data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
- data/spec/integration/app_spec.rb +28 -26
- data/spec/integration/associations/belongs_to_spec.rb +18 -0
- data/spec/integration/associations/embedded_dirty_spec.rb +28 -0
- data/spec/integration/associations/embedded_spec.rb +15 -0
- data/spec/integration/associations/embeds_many_spec.rb +15 -2
- data/spec/integration/associations/embeds_one_spec.rb +18 -0
- data/spec/integration/associations/foreign_key_spec.rb +9 -0
- data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
- data/spec/integration/associations/has_one_spec.rb +97 -1
- data/spec/integration/associations/scope_option_spec.rb +1 -1
- data/spec/integration/callbacks_models.rb +95 -1
- data/spec/integration/callbacks_spec.rb +226 -4
- data/spec/integration/criteria/range_spec.rb +95 -1
- data/spec/integration/discriminator_key_spec.rb +115 -76
- data/spec/integration/dots_and_dollars_spec.rb +277 -0
- data/spec/integration/matcher_examples_spec.rb +20 -13
- data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
- data/spec/integration/matcher_operator_spec.rb +3 -5
- data/spec/integration/persistence/range_field_spec.rb +350 -0
- data/spec/lite_spec_helper.rb +1 -1
- data/spec/mongoid/association/counter_cache_spec.rb +1 -1
- data/spec/mongoid/association/depending_spec.rb +9 -9
- data/spec/mongoid/association/eager_spec.rb +2 -1
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +219 -8
- data/spec/mongoid/association/embedded/embeds_many_models.rb +157 -0
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
- data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
- data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +67 -4
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +8 -8
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +82 -13
- data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
- data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
- data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
- data/spec/mongoid/association/syncable_spec.rb +14 -0
- data/spec/mongoid/atomic/paths_spec.rb +0 -14
- data/spec/mongoid/atomic_spec.rb +22 -0
- data/spec/mongoid/attributes/nested_spec.rb +80 -11
- data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
- data/spec/mongoid/attributes/projector_spec.rb +1 -5
- data/spec/mongoid/attributes_spec.rb +524 -27
- data/spec/mongoid/changeable_spec.rb +130 -13
- data/spec/mongoid/clients/factory_spec.rb +34 -42
- data/spec/mongoid/clients/options_spec.rb +1 -0
- data/spec/mongoid/clients/sessions_spec.rb +0 -38
- data/spec/mongoid/clients_spec.rb +32 -2
- data/spec/mongoid/config/environment_spec.rb +39 -1
- data/spec/mongoid/config_spec.rb +104 -13
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
- data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
- data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
- data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
- data/spec/mongoid/contextual/memory_spec.rb +1337 -69
- data/spec/mongoid/contextual/mongo_spec.rb +1105 -172
- data/spec/mongoid/contextual/none_spec.rb +38 -0
- data/spec/mongoid/copyable_spec.rb +451 -1
- data/spec/mongoid/criteria/findable_spec.rb +86 -210
- data/spec/mongoid/criteria/includable_spec.rb +1492 -0
- data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
- data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/optional_spec.rb +0 -484
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +289 -124
- data/spec/mongoid/criteria/queryable/selector_spec.rb +14 -2
- data/spec/mongoid/criteria_spec.rb +474 -1198
- data/spec/mongoid/document_fields_spec.rb +173 -24
- data/spec/mongoid/document_spec.rb +32 -41
- data/spec/mongoid/errors/document_not_found_spec.rb +76 -0
- data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
- data/spec/mongoid/errors/no_environment_spec.rb +3 -3
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
- data/spec/mongoid/extensions/array_spec.rb +16 -2
- data/spec/mongoid/extensions/big_decimal_spec.rb +697 -212
- data/spec/mongoid/extensions/binary_spec.rb +44 -9
- data/spec/mongoid/extensions/boolean_spec.rb +68 -82
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
- data/spec/mongoid/extensions/date_spec.rb +71 -1
- data/spec/mongoid/extensions/date_time_spec.rb +15 -9
- data/spec/mongoid/extensions/float_spec.rb +48 -76
- data/spec/mongoid/extensions/hash_spec.rb +30 -0
- data/spec/mongoid/extensions/integer_spec.rb +45 -66
- data/spec/mongoid/extensions/range_spec.rb +255 -54
- data/spec/mongoid/extensions/regexp_spec.rb +58 -33
- data/spec/mongoid/extensions/set_spec.rb +106 -0
- data/spec/mongoid/extensions/string_spec.rb +53 -25
- data/spec/mongoid/extensions/symbol_spec.rb +18 -25
- data/spec/mongoid/extensions/time_spec.rb +634 -66
- data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
- data/spec/mongoid/factory_spec.rb +61 -1
- data/spec/mongoid/fields_spec.rb +321 -50
- data/spec/mongoid/findable_spec.rb +80 -15
- data/spec/mongoid/indexable/specification_spec.rb +2 -2
- data/spec/mongoid/indexable_spec.rb +16 -19
- data/spec/mongoid/interceptable_spec.rb +584 -5
- data/spec/mongoid/interceptable_spec_models.rb +235 -4
- data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
- data/spec/mongoid/mongoizable_spec.rb +285 -0
- data/spec/mongoid/persistable/creatable_spec.rb +2 -2
- data/spec/mongoid/persistable/deletable_spec.rb +2 -2
- data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
- data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
- data/spec/mongoid/persistence_context_spec.rb +50 -1
- data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
- data/spec/mongoid/query_cache_spec.rb +0 -154
- data/spec/mongoid/reloadable_spec.rb +35 -2
- data/spec/mongoid/scopable_spec.rb +21 -1
- data/spec/mongoid/shardable_spec.rb +14 -0
- data/spec/mongoid/stateful_spec.rb +28 -0
- data/spec/mongoid/timestamps_spec.rb +390 -0
- data/spec/mongoid/timestamps_spec_models.rb +67 -0
- data/spec/mongoid/touchable_spec.rb +116 -0
- data/spec/mongoid/touchable_spec_models.rb +12 -8
- data/spec/mongoid/traversable_spec.rb +4 -11
- data/spec/mongoid/validatable/presence_spec.rb +1 -1
- data/spec/mongoid/validatable/uniqueness_spec.rb +60 -31
- data/spec/mongoid/warnings_spec.rb +35 -0
- data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
- data/spec/rails/mongoid_spec.rb +4 -16
- data/spec/shared/lib/mrss/constraints.rb +8 -16
- data/spec/shared/lib/mrss/docker_runner.rb +23 -3
- data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +32 -1
- data/spec/shared/share/Dockerfile.erb +34 -48
- data/spec/shared/shlib/config.sh +27 -0
- data/spec/shared/shlib/server.sh +32 -19
- data/spec/shared/shlib/set_env.sh +37 -0
- data/spec/support/constraints.rb +24 -0
- data/spec/support/macros.rb +39 -0
- data/spec/support/models/augmentation.rb +12 -0
- data/spec/support/models/band.rb +3 -0
- data/spec/support/models/catalog.rb +24 -0
- data/spec/support/models/circus.rb +3 -0
- data/spec/support/models/code.rb +2 -0
- data/spec/support/models/fanatic.rb +8 -0
- data/spec/support/models/implant.rb +9 -0
- data/spec/support/models/label.rb +2 -0
- data/spec/support/models/membership.rb +1 -0
- data/spec/support/models/passport.rb +9 -0
- data/spec/support/models/person.rb +1 -0
- data/spec/support/models/player.rb +2 -0
- data/spec/support/models/powerup.rb +12 -0
- data/spec/support/models/registry.rb +1 -0
- data/spec/support/models/school.rb +14 -0
- data/spec/support/models/shield.rb +18 -0
- data/spec/support/models/student.rb +14 -0
- data/spec/support/models/weapon.rb +12 -0
- data/spec/support/schema_maps/schema_map_aws.json +17 -0
- data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_azure.json +17 -0
- data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_gcp.json +17 -0
- data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_kmip.json +17 -0
- data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_local.json +18 -0
- data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
- data/spec/support/spec_config.rb +4 -0
- data.tar.gz.sig +0 -0
- metadata +76 -13
- metadata.gz.sig +0 -0
- data/lib/mongoid/errors/eager_load.rb +0 -23
- data/lib/mongoid/errors/invalid_value.rb +0 -17
- data/spec/mongoid/errors/eager_load_spec.rb +0 -31
@@ -74,11 +74,15 @@ module Mongoid
|
|
74
74
|
# @example Get the distinct values.
|
75
75
|
# context.distinct(:name)
|
76
76
|
#
|
77
|
-
# @param [ String
|
77
|
+
# @param [ String | Symbol ] field The name of the field.
|
78
78
|
#
|
79
79
|
# @return [ Array<Object> ] The distinct values for the field.
|
80
80
|
def distinct(field)
|
81
|
-
|
81
|
+
if Mongoid.legacy_pluck_distinct
|
82
|
+
documents.map{ |doc| doc.send(field) }.uniq
|
83
|
+
else
|
84
|
+
pluck(field).uniq
|
85
|
+
end
|
82
86
|
end
|
83
87
|
|
84
88
|
# Iterate over the context. If provided a block, yield to a Mongoid
|
@@ -108,7 +112,7 @@ module Mongoid
|
|
108
112
|
#
|
109
113
|
# @return [ true, false ] If the count is more than zero.
|
110
114
|
def exists?
|
111
|
-
|
115
|
+
any?
|
112
116
|
end
|
113
117
|
|
114
118
|
# Get the first document in the database for the criteria's selector.
|
@@ -116,9 +120,15 @@ module Mongoid
|
|
116
120
|
# @example Get the first document.
|
117
121
|
# context.first
|
118
122
|
#
|
123
|
+
# @param [ Integer ] limit The number of documents to return.
|
124
|
+
#
|
119
125
|
# @return [ Document ] The first document.
|
120
|
-
def first(
|
121
|
-
|
126
|
+
def first(limit = nil)
|
127
|
+
if limit
|
128
|
+
eager_load(documents.first(limit))
|
129
|
+
else
|
130
|
+
eager_load([documents.first]).first
|
131
|
+
end
|
122
132
|
end
|
123
133
|
alias :one :first
|
124
134
|
alias :find_first :first
|
@@ -159,9 +169,48 @@ module Mongoid
|
|
159
169
|
# @example Get the last document.
|
160
170
|
# context.last
|
161
171
|
#
|
172
|
+
# @param [ Integer ] limit The number of documents to return.
|
173
|
+
#
|
162
174
|
# @return [ Document ] The last document.
|
163
|
-
def last
|
164
|
-
|
175
|
+
def last(limit = nil)
|
176
|
+
if limit
|
177
|
+
eager_load(documents.last(limit))
|
178
|
+
else
|
179
|
+
eager_load([documents.last]).first
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
# Take the given number of documents from the database.
|
184
|
+
#
|
185
|
+
# @example Take a document.
|
186
|
+
# context.take
|
187
|
+
#
|
188
|
+
# @param [ Integer | nil ] limit The number of documents to take or nil.
|
189
|
+
#
|
190
|
+
# @return [ Document ] The document.
|
191
|
+
def take(limit = nil)
|
192
|
+
if limit
|
193
|
+
eager_load(documents.take(limit))
|
194
|
+
else
|
195
|
+
eager_load([documents.first]).first
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
# Take the given number of documents from the database.
|
200
|
+
#
|
201
|
+
# @example Take a document.
|
202
|
+
# context.take
|
203
|
+
#
|
204
|
+
# @return [ Document ] The document.
|
205
|
+
#
|
206
|
+
# @raises [ Mongoid::Errors::DocumentNotFound ] raises when there are no
|
207
|
+
# documents to take.
|
208
|
+
def take!
|
209
|
+
if documents.empty?
|
210
|
+
raise Errors::DocumentNotFound.new(klass, nil, nil)
|
211
|
+
else
|
212
|
+
eager_load([documents.first]).first
|
213
|
+
end
|
165
214
|
end
|
166
215
|
|
167
216
|
# Get the length of matching documents in the context.
|
@@ -182,21 +231,58 @@ module Mongoid
|
|
182
231
|
#
|
183
232
|
# @param [ Integer ] value The number of documents to return.
|
184
233
|
#
|
185
|
-
# @return [
|
234
|
+
# @return [ Memory ] The context.
|
186
235
|
def limit(value)
|
187
236
|
self.limiting = value
|
188
237
|
self
|
189
238
|
end
|
190
239
|
|
240
|
+
# Pluck the field values in memory.
|
241
|
+
#
|
242
|
+
# @example Get the values in memory.
|
243
|
+
# context.pluck(:name)
|
244
|
+
#
|
245
|
+
# @param [ String | Symbol ] *fields Field(s) to pluck.
|
246
|
+
#
|
247
|
+
# @return [ Array ] The array of plucked values.
|
191
248
|
def pluck(*fields)
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
fields.map { |n| doc[n] }.compact
|
249
|
+
if Mongoid.legacy_pluck_distinct
|
250
|
+
documents.pluck(*fields)
|
251
|
+
else
|
252
|
+
documents.map do |doc|
|
253
|
+
pluck_from_doc(doc, *fields)
|
198
254
|
end
|
199
|
-
end
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
# Pick the field values in memory.
|
259
|
+
#
|
260
|
+
# @example Get the values in memory.
|
261
|
+
# context.pick(:name)
|
262
|
+
#
|
263
|
+
# @param [ String | Symbol ] *fields Field(s) to pick.
|
264
|
+
#
|
265
|
+
# @return [ Object, Array<Object> ] The picked values.
|
266
|
+
def pick(*fields)
|
267
|
+
if doc = documents.first
|
268
|
+
pluck_from_doc(doc, *fields)
|
269
|
+
end
|
270
|
+
end
|
271
|
+
|
272
|
+
# Tally the field values in memory.
|
273
|
+
#
|
274
|
+
# @example Get the counts of values in memory.
|
275
|
+
# context.tally(:name)
|
276
|
+
#
|
277
|
+
# @param [ String | Symbol ] field Field to tally.
|
278
|
+
#
|
279
|
+
# @return [ Hash ] The hash of counts.
|
280
|
+
def tally(field)
|
281
|
+
return documents.each_with_object({}) do |d, acc|
|
282
|
+
v = retrieve_value_at_path(d, field)
|
283
|
+
acc[v] ||= 0
|
284
|
+
acc[v] += 1
|
285
|
+
end
|
200
286
|
end
|
201
287
|
|
202
288
|
# Skips the provided number of documents.
|
@@ -206,7 +292,7 @@ module Mongoid
|
|
206
292
|
#
|
207
293
|
# @param [ Integer ] value The number of documents to skip.
|
208
294
|
#
|
209
|
-
# @return [
|
295
|
+
# @return [ Memory ] The context.
|
210
296
|
def skip(value)
|
211
297
|
self.skipping = value
|
212
298
|
self
|
@@ -220,7 +306,7 @@ module Mongoid
|
|
220
306
|
# @param [ Hash ] values The sorting values as field/direction(1/-1)
|
221
307
|
# pairs.
|
222
308
|
#
|
223
|
-
# @return [
|
309
|
+
# @return [ Memory ] The context.
|
224
310
|
def sort(values)
|
225
311
|
in_place_sort(values) and self
|
226
312
|
end
|
@@ -414,6 +500,79 @@ module Mongoid
|
|
414
500
|
def _session
|
415
501
|
@criteria.send(:_session)
|
416
502
|
end
|
503
|
+
|
504
|
+
# Retrieve the value for the current document at the given field path.
|
505
|
+
#
|
506
|
+
# For example, if I have the following models:
|
507
|
+
#
|
508
|
+
# User has_many Accounts
|
509
|
+
# address is a hash on Account
|
510
|
+
#
|
511
|
+
# u = User.new(accounts: [ Account.new(address: { street: "W 50th" }) ])
|
512
|
+
# retrieve_value_at_path(u, "user.accounts.address.street")
|
513
|
+
# # => [ "W 50th" ]
|
514
|
+
#
|
515
|
+
# Note that the result is in an array since accounts is an array. If it
|
516
|
+
# was nested in two arrays the result would be in a 2D array.
|
517
|
+
#
|
518
|
+
# @param [ Object ] document The object to traverse the field path.
|
519
|
+
# @param [ String ] field_path The dotted string that represents the path
|
520
|
+
# to the value.
|
521
|
+
#
|
522
|
+
# @return [ Object | nil ] The value at the given field path or nil if it
|
523
|
+
# doesn't exist.
|
524
|
+
def retrieve_value_at_path(document, field_path)
|
525
|
+
return if field_path.blank? || !document
|
526
|
+
segment, remaining = field_path.to_s.split('.', 2)
|
527
|
+
|
528
|
+
curr = if document.is_a?(Document)
|
529
|
+
# Retrieves field for segment to check localization. Only does one
|
530
|
+
# iteration since there's no dots
|
531
|
+
res = if remaining
|
532
|
+
field = document.class.traverse_association_tree(segment)
|
533
|
+
# If this is a localized field, and there are remaining, get the
|
534
|
+
# _translations hash so that we can get the specified translation in
|
535
|
+
# the remaining
|
536
|
+
if field&.localized?
|
537
|
+
document.send("#{segment}_translations")
|
538
|
+
end
|
539
|
+
end
|
540
|
+
meth = klass.aliased_associations[segment] || segment
|
541
|
+
res.nil? ? document.try(meth) : res
|
542
|
+
elsif document.is_a?(Hash)
|
543
|
+
# TODO: Remove the indifferent access when implementing MONGOID-5410.
|
544
|
+
document.key?(segment.to_s) ?
|
545
|
+
document[segment.to_s] :
|
546
|
+
document[segment.to_sym]
|
547
|
+
else
|
548
|
+
nil
|
549
|
+
end
|
550
|
+
|
551
|
+
return curr unless remaining
|
552
|
+
|
553
|
+
if curr.is_a?(Array)
|
554
|
+
# compact is used for consistency with server behavior.
|
555
|
+
curr.map { |d| retrieve_value_at_path(d, remaining) }.compact
|
556
|
+
else
|
557
|
+
retrieve_value_at_path(curr, remaining)
|
558
|
+
end
|
559
|
+
end
|
560
|
+
|
561
|
+
# Pluck the field values from the given document.
|
562
|
+
#
|
563
|
+
# @param [ Document ] doc The document to pluck from.
|
564
|
+
# @param [ String | Symbol ] *fields Field(s) to pluck.
|
565
|
+
#
|
566
|
+
# @return [ Object, Array<Object> ] The plucked values.
|
567
|
+
def pluck_from_doc(doc, *fields)
|
568
|
+
if fields.length == 1
|
569
|
+
retrieve_value_at_path(doc, fields.first)
|
570
|
+
else
|
571
|
+
fields.map do |field|
|
572
|
+
retrieve_value_at_path(doc, field)
|
573
|
+
end
|
574
|
+
end
|
575
|
+
end
|
417
576
|
end
|
418
577
|
end
|
419
578
|
end
|