mongoid 2.8.1 → 3.0.0.rc
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/CHANGELOG.md +802 -58
- data/LICENSE +1 -1
- data/README.md +10 -11
- data/Rakefile +2 -8
- data/lib/config/locales/en.yml +441 -51
- data/lib/mongoid.rb +24 -39
- data/lib/mongoid/atomic.rb +16 -33
- data/lib/mongoid/atomic/modifiers.rb +2 -2
- data/lib/mongoid/atomic/paths/embedded.rb +4 -5
- data/lib/mongoid/atomic/paths/embedded/many.rb +6 -6
- data/lib/mongoid/atomic/paths/embedded/one.rb +5 -5
- data/lib/mongoid/atomic/paths/root.rb +4 -5
- data/lib/mongoid/attributes.rb +95 -32
- data/lib/mongoid/attributes/processing.rb +14 -10
- data/lib/mongoid/attributes/readonly.rb +56 -0
- data/lib/mongoid/callbacks.rb +90 -27
- data/lib/mongoid/collections/retry.rb +2 -3
- data/lib/mongoid/components.rb +11 -23
- data/lib/mongoid/config.rb +87 -233
- data/lib/mongoid/config/environment.rb +5 -6
- data/lib/mongoid/config/inflections.rb +6 -0
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/config/validators.rb +3 -0
- data/lib/mongoid/config/validators/option.rb +25 -0
- data/lib/mongoid/config/validators/session.rb +140 -0
- data/lib/mongoid/contextual.rb +50 -0
- data/lib/mongoid/contextual/aggregable/memory.rb +98 -0
- data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
- data/lib/mongoid/contextual/atomic.rb +179 -0
- data/lib/mongoid/contextual/command.rb +43 -0
- data/lib/mongoid/contextual/find_and_modify.rb +66 -0
- data/lib/mongoid/contextual/map_reduce.rb +273 -0
- data/lib/mongoid/contextual/memory.rb +383 -0
- data/lib/mongoid/contextual/mongo.rb +543 -0
- data/lib/mongoid/copyable.rb +3 -34
- data/lib/mongoid/criteria.rb +436 -250
- data/lib/mongoid/criterion/inspection.rb +14 -8
- data/lib/mongoid/criterion/scoping.rb +114 -44
- data/lib/mongoid/dirty.rb +152 -67
- data/lib/mongoid/document.rb +69 -50
- data/lib/mongoid/errors.rb +22 -1
- data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
- data/lib/mongoid/errors/callback.rb +5 -6
- data/lib/mongoid/errors/delete_restriction.rb +29 -0
- data/lib/mongoid/errors/document_not_found.rb +98 -17
- data/lib/mongoid/errors/eager_load.rb +3 -6
- data/lib/mongoid/errors/invalid_collection.rb +3 -3
- data/lib/mongoid/errors/invalid_config_option.rb +27 -0
- data/lib/mongoid/errors/invalid_database.rb +3 -3
- data/lib/mongoid/errors/invalid_field.rb +54 -8
- data/lib/mongoid/errors/invalid_field_option.rb +35 -0
- data/lib/mongoid/errors/invalid_find.rb +3 -3
- data/lib/mongoid/errors/invalid_index.rb +28 -0
- data/lib/mongoid/errors/invalid_options.rb +4 -4
- data/lib/mongoid/errors/invalid_scope.rb +24 -0
- data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
- data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
- data/lib/mongoid/errors/invalid_time.rb +3 -6
- data/lib/mongoid/errors/inverse_not_found.rb +29 -0
- data/lib/mongoid/errors/mixed_relations.rb +4 -9
- data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
- data/lib/mongoid/errors/mongoid_error.rb +54 -3
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
- data/lib/mongoid/errors/no_default_session.rb +23 -0
- data/lib/mongoid/errors/no_environment.rb +3 -3
- data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
- data/lib/mongoid/errors/no_parent.rb +24 -0
- data/lib/mongoid/errors/no_session_config.rb +22 -0
- data/lib/mongoid/errors/no_session_database.rb +27 -0
- data/lib/mongoid/errors/no_session_hosts.rb +27 -0
- data/lib/mongoid/errors/no_sessions_config.rb +20 -0
- data/lib/mongoid/errors/readonly_attribute.rb +25 -0
- data/lib/mongoid/errors/scope_overwrite.rb +4 -4
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +4 -4
- data/lib/mongoid/errors/unknown_attribute.rb +25 -0
- data/lib/mongoid/errors/unsaved_document.rb +4 -8
- data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
- data/lib/mongoid/errors/unsupported_version.rb +4 -4
- data/lib/mongoid/errors/validations.rb +7 -6
- data/lib/mongoid/errors/versioning_not_on_root.rb +23 -0
- data/lib/mongoid/extensions.rb +28 -76
- data/lib/mongoid/extensions/array.rb +127 -0
- data/lib/mongoid/extensions/big_decimal.rb +42 -0
- data/lib/mongoid/extensions/boolean.rb +24 -0
- data/lib/mongoid/extensions/date.rb +70 -0
- data/lib/mongoid/extensions/date_time.rb +68 -0
- data/lib/mongoid/extensions/false_class.rb +26 -0
- data/lib/mongoid/extensions/float.rb +44 -0
- data/lib/mongoid/extensions/hash.rb +91 -0
- data/lib/mongoid/extensions/integer.rb +54 -0
- data/lib/mongoid/extensions/module.rb +28 -0
- data/lib/mongoid/extensions/nil_class.rb +21 -0
- data/lib/mongoid/extensions/object.rb +188 -0
- data/lib/mongoid/extensions/object_id.rb +53 -0
- data/lib/mongoid/extensions/range.rb +55 -0
- data/lib/mongoid/extensions/regexp.rb +27 -0
- data/lib/mongoid/extensions/set.rb +55 -0
- data/lib/mongoid/extensions/string.rb +155 -0
- data/lib/mongoid/extensions/symbol.rb +54 -0
- data/lib/mongoid/extensions/time.rb +78 -0
- data/lib/mongoid/extensions/time_with_zone.rb +55 -0
- data/lib/mongoid/extensions/true_class.rb +26 -0
- data/lib/mongoid/factory.rb +1 -1
- data/lib/mongoid/fields.rb +129 -194
- data/lib/mongoid/fields/foreign_key.rb +134 -0
- data/lib/mongoid/fields/localized.rb +73 -0
- data/lib/mongoid/fields/standard.rb +268 -0
- data/lib/mongoid/fields/validators.rb +2 -0
- data/lib/mongoid/fields/validators/macro.rb +83 -0
- data/lib/mongoid/finders.rb +42 -43
- data/lib/mongoid/hierarchy.rb +25 -14
- data/lib/mongoid/identity_map.rb +31 -19
- data/lib/mongoid/indexes.rb +66 -15
- data/lib/mongoid/indexes/validators/options.rb +80 -0
- data/lib/mongoid/inspection.rb +1 -1
- data/lib/mongoid/javascript.rb +1 -1
- data/lib/mongoid/json.rb +2 -2
- data/lib/mongoid/loggable.rb +69 -0
- data/lib/mongoid/matchers.rb +1 -1
- data/lib/mongoid/matchers/all.rb +7 -8
- data/lib/mongoid/matchers/and.rb +3 -3
- data/lib/mongoid/matchers/default.rb +6 -4
- data/lib/mongoid/matchers/exists.rb +2 -2
- data/lib/mongoid/matchers/gt.rb +2 -2
- data/lib/mongoid/matchers/gte.rb +2 -2
- data/lib/mongoid/matchers/in.rb +3 -7
- data/lib/mongoid/matchers/lt.rb +2 -2
- data/lib/mongoid/matchers/lte.rb +2 -2
- data/lib/mongoid/matchers/ne.rb +2 -2
- data/lib/mongoid/matchers/nin.rb +2 -2
- data/lib/mongoid/matchers/or.rb +2 -2
- data/lib/mongoid/matchers/size.rb +2 -2
- data/lib/mongoid/matchers/strategies.rb +3 -3
- data/lib/mongoid/multi_parameter_attributes.rb +8 -10
- data/lib/mongoid/nested_attributes.rb +17 -9
- data/lib/mongoid/observer.rb +1 -2
- data/lib/mongoid/paranoia.rb +13 -18
- data/lib/mongoid/persistence.rb +43 -39
- data/lib/mongoid/persistence/atomic.rb +2 -2
- data/lib/mongoid/persistence/atomic/add_to_set.rb +5 -9
- data/lib/mongoid/persistence/atomic/bit.rb +5 -7
- data/lib/mongoid/persistence/atomic/inc.rb +5 -7
- data/lib/mongoid/persistence/atomic/operation.rb +45 -6
- data/lib/mongoid/persistence/atomic/pop.rb +5 -7
- data/lib/mongoid/persistence/atomic/pull.rb +5 -7
- data/lib/mongoid/persistence/atomic/pull_all.rb +5 -7
- data/lib/mongoid/persistence/atomic/push.rb +4 -10
- data/lib/mongoid/persistence/atomic/push_all.rb +4 -10
- data/lib/mongoid/persistence/atomic/rename.rb +6 -7
- data/lib/mongoid/persistence/atomic/sets.rb +5 -7
- data/lib/mongoid/persistence/atomic/unset.rb +4 -5
- data/lib/mongoid/persistence/deletion.rb +2 -2
- data/lib/mongoid/persistence/insertion.rb +10 -16
- data/lib/mongoid/persistence/modification.rb +5 -9
- data/lib/mongoid/persistence/operations.rb +6 -19
- data/lib/mongoid/persistence/operations/embedded/insert.rb +7 -6
- data/lib/mongoid/persistence/operations/embedded/remove.rb +5 -5
- data/lib/mongoid/persistence/operations/insert.rb +4 -4
- data/lib/mongoid/persistence/operations/remove.rb +4 -4
- data/lib/mongoid/persistence/operations/update.rb +5 -5
- data/lib/mongoid/railtie.rb +26 -11
- data/lib/mongoid/railties/database.rake +22 -108
- data/lib/mongoid/relations.rb +4 -6
- data/lib/mongoid/relations/accessors.rb +119 -19
- data/lib/mongoid/relations/auto_save.rb +59 -5
- data/lib/mongoid/relations/binding.rb +211 -2
- data/lib/mongoid/relations/bindings/embedded/in.rb +16 -22
- data/lib/mongoid/relations/bindings/embedded/many.rb +9 -50
- data/lib/mongoid/relations/bindings/embedded/one.rb +10 -16
- data/lib/mongoid/relations/bindings/referenced/in.rb +31 -57
- data/lib/mongoid/relations/bindings/referenced/many.rb +8 -20
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -19
- data/lib/mongoid/relations/bindings/referenced/one.rb +10 -24
- data/lib/mongoid/relations/builder.rb +3 -3
- data/lib/mongoid/relations/builders.rb +19 -16
- data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
- data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
- data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -4
- data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
- data/lib/mongoid/relations/builders/referenced/many.rb +5 -5
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
- data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
- data/lib/mongoid/relations/cascading.rb +6 -4
- data/lib/mongoid/relations/cascading/delete.rb +3 -5
- data/lib/mongoid/relations/cascading/destroy.rb +3 -3
- data/lib/mongoid/relations/cascading/nullify.rb +3 -3
- data/lib/mongoid/relations/cascading/restrict.rb +37 -0
- data/lib/mongoid/relations/constraint.rb +4 -3
- data/lib/mongoid/relations/conversions.rb +5 -6
- data/lib/mongoid/relations/cyclic.rb +7 -7
- data/lib/mongoid/relations/embedded/batchable.rb +346 -0
- data/lib/mongoid/relations/embedded/in.rb +23 -12
- data/lib/mongoid/relations/embedded/many.rb +99 -161
- data/lib/mongoid/relations/embedded/one.rb +25 -14
- data/lib/mongoid/relations/macros.rb +105 -61
- data/lib/mongoid/relations/many.rb +93 -14
- data/lib/mongoid/relations/metadata.rb +200 -45
- data/lib/mongoid/relations/nested_builder.rb +3 -5
- data/lib/mongoid/relations/one.rb +2 -2
- data/lib/mongoid/relations/options.rb +2 -2
- data/lib/mongoid/relations/polymorphic.rb +9 -9
- data/lib/mongoid/relations/proxy.rb +60 -31
- data/lib/mongoid/relations/referenced/in.rb +40 -15
- data/lib/mongoid/relations/referenced/many.rb +117 -132
- data/lib/mongoid/relations/referenced/many_to_many.rb +101 -46
- data/lib/mongoid/relations/referenced/one.rb +34 -13
- data/lib/mongoid/relations/reflections.rb +3 -3
- data/lib/mongoid/relations/synchronization.rb +19 -23
- data/lib/mongoid/relations/targets/enumerable.rb +86 -57
- data/lib/mongoid/reloading.rb +12 -14
- data/lib/mongoid/scoping.rb +329 -0
- data/lib/mongoid/serialization.rb +8 -27
- data/lib/mongoid/sessions.rb +359 -0
- data/lib/mongoid/sessions/factory.rb +106 -0
- data/lib/mongoid/sessions/mongo_uri.rb +93 -0
- data/lib/mongoid/sessions/validators.rb +2 -0
- data/lib/mongoid/sessions/validators/storage.rb +49 -0
- data/lib/mongoid/sharding.rb +6 -6
- data/lib/mongoid/state.rb +6 -7
- data/lib/mongoid/threaded.rb +167 -59
- data/lib/mongoid/threaded/lifecycle.rb +21 -22
- data/lib/mongoid/threaded/sessions.rb +0 -0
- data/lib/mongoid/timestamps.rb +1 -1
- data/lib/mongoid/timestamps/created.rb +8 -4
- data/lib/mongoid/timestamps/timeless.rb +6 -4
- data/lib/mongoid/timestamps/updated.rb +3 -3
- data/lib/mongoid/unit_of_work.rb +61 -0
- data/lib/mongoid/validations.rb +27 -19
- data/lib/mongoid/validations/associated.rb +2 -2
- data/lib/mongoid/validations/format.rb +2 -2
- data/lib/mongoid/validations/presence.rb +31 -5
- data/lib/mongoid/validations/uniqueness.rb +9 -12
- data/lib/mongoid/version.rb +2 -2
- data/lib/mongoid/versioning.rb +25 -26
- data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
- data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +59 -19
- data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
- data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
- data/lib/rails/generators/mongoid_generator.rb +5 -5
- data/lib/rails/mongoid.rb +69 -25
- metadata +110 -137
- checksums.yaml +0 -7
- data/lib/config/locales/bg.yml +0 -61
- data/lib/config/locales/de.yml +0 -61
- data/lib/config/locales/en-GB.yml +0 -64
- data/lib/config/locales/es.yml +0 -59
- data/lib/config/locales/fr.yml +0 -62
- data/lib/config/locales/hi.yml +0 -53
- data/lib/config/locales/hu.yml +0 -64
- data/lib/config/locales/id.yml +0 -62
- data/lib/config/locales/it.yml +0 -59
- data/lib/config/locales/ja.yml +0 -57
- data/lib/config/locales/kr.yml +0 -54
- data/lib/config/locales/nl.yml +0 -61
- data/lib/config/locales/pl.yml +0 -59
- data/lib/config/locales/pt-BR.yml +0 -60
- data/lib/config/locales/pt.yml +0 -60
- data/lib/config/locales/ro.yml +0 -66
- data/lib/config/locales/ru.yml +0 -61
- data/lib/config/locales/sv.yml +0 -60
- data/lib/config/locales/vi.yml +0 -62
- data/lib/config/locales/zh-CN.yml +0 -53
- data/lib/mongoid/collection.rb +0 -157
- data/lib/mongoid/collections.rb +0 -120
- data/lib/mongoid/collections/master.rb +0 -45
- data/lib/mongoid/collections/operations.rb +0 -44
- data/lib/mongoid/config/database.rb +0 -181
- data/lib/mongoid/config/replset_database.rb +0 -80
- data/lib/mongoid/contexts.rb +0 -25
- data/lib/mongoid/contexts/enumerable.rb +0 -313
- data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
- data/lib/mongoid/contexts/mongo.rb +0 -487
- data/lib/mongoid/criterion/builder.rb +0 -34
- data/lib/mongoid/criterion/complex.rb +0 -84
- data/lib/mongoid/criterion/creational.rb +0 -34
- data/lib/mongoid/criterion/exclusion.rb +0 -110
- data/lib/mongoid/criterion/inclusion.rb +0 -290
- data/lib/mongoid/criterion/optional.rb +0 -259
- data/lib/mongoid/criterion/selector.rb +0 -177
- data/lib/mongoid/cursor.rb +0 -88
- data/lib/mongoid/default_scope.rb +0 -36
- data/lib/mongoid/errors/invalid_type.rb +0 -25
- data/lib/mongoid/extensions/array/deep_copy.rb +0 -25
- data/lib/mongoid/extensions/array/deletion.rb +0 -29
- data/lib/mongoid/extensions/false_class/equality.rb +0 -26
- data/lib/mongoid/extensions/hash/criteria_helpers.rb +0 -47
- data/lib/mongoid/extensions/hash/deep_copy.rb +0 -25
- data/lib/mongoid/extensions/hash/scoping.rb +0 -25
- data/lib/mongoid/extensions/integer/checks.rb +0 -23
- data/lib/mongoid/extensions/nil/collectionization.rb +0 -23
- data/lib/mongoid/extensions/object/checks.rb +0 -29
- data/lib/mongoid/extensions/object/deep_copy.rb +0 -21
- data/lib/mongoid/extensions/object/reflections.rb +0 -48
- data/lib/mongoid/extensions/object/substitutable.rb +0 -15
- data/lib/mongoid/extensions/object/yoda.rb +0 -44
- data/lib/mongoid/extensions/object_id/conversions.rb +0 -60
- data/lib/mongoid/extensions/proc/scoping.rb +0 -25
- data/lib/mongoid/extensions/string/checks.rb +0 -36
- data/lib/mongoid/extensions/string/conversions.rb +0 -22
- data/lib/mongoid/extensions/string/inflections.rb +0 -118
- data/lib/mongoid/extensions/symbol/checks.rb +0 -23
- data/lib/mongoid/extensions/symbol/inflections.rb +0 -67
- data/lib/mongoid/extensions/true_class/equality.rb +0 -26
- data/lib/mongoid/extras.rb +0 -31
- data/lib/mongoid/fields/internal/array.rb +0 -77
- data/lib/mongoid/fields/internal/big_decimal.rb +0 -63
- data/lib/mongoid/fields/internal/bignum.rb +0 -10
- data/lib/mongoid/fields/internal/binary.rb +0 -11
- data/lib/mongoid/fields/internal/boolean.rb +0 -58
- data/lib/mongoid/fields/internal/date.rb +0 -51
- data/lib/mongoid/fields/internal/date_time.rb +0 -28
- data/lib/mongoid/fields/internal/false_class.rb +0 -10
- data/lib/mongoid/fields/internal/fixnum.rb +0 -10
- data/lib/mongoid/fields/internal/float.rb +0 -47
- data/lib/mongoid/fields/internal/foreign_keys/array.rb +0 -88
- data/lib/mongoid/fields/internal/foreign_keys/object.rb +0 -56
- data/lib/mongoid/fields/internal/hash.rb +0 -11
- data/lib/mongoid/fields/internal/integer.rb +0 -59
- data/lib/mongoid/fields/internal/localized.rb +0 -62
- data/lib/mongoid/fields/internal/nil_class.rb +0 -53
- data/lib/mongoid/fields/internal/object.rb +0 -11
- data/lib/mongoid/fields/internal/object_id.rb +0 -46
- data/lib/mongoid/fields/internal/range.rb +0 -61
- data/lib/mongoid/fields/internal/set.rb +0 -57
- data/lib/mongoid/fields/internal/string.rb +0 -42
- data/lib/mongoid/fields/internal/symbol.rb +0 -43
- data/lib/mongoid/fields/internal/time.rb +0 -23
- data/lib/mongoid/fields/internal/time_with_zone.rb +0 -23
- data/lib/mongoid/fields/internal/timekeeping.rb +0 -122
- data/lib/mongoid/fields/internal/true_class.rb +0 -10
- data/lib/mongoid/fields/mappings.rb +0 -42
- data/lib/mongoid/fields/serializable.rb +0 -270
- data/lib/mongoid/identity.rb +0 -92
- data/lib/mongoid/keys.rb +0 -144
- data/lib/mongoid/logger.rb +0 -45
- data/lib/mongoid/multi_database.rb +0 -36
- data/lib/mongoid/named_scope.rb +0 -166
- data/lib/mongoid/relations/embedded/atomic.rb +0 -89
- data/lib/mongoid/relations/embedded/atomic/operation.rb +0 -63
- data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
- data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
- data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
- data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
- data/lib/mongoid/relations/referenced/batch.rb +0 -73
- data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
- data/lib/mongoid/safety.rb +0 -105
- data/lib/mongoid/scope.rb +0 -31
@@ -0,0 +1,179 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Contextual
|
4
|
+
module Atomic
|
5
|
+
|
6
|
+
# Execute an atomic $addToSet on the matching documents.
|
7
|
+
#
|
8
|
+
# @example Add the value to the set.
|
9
|
+
# context.add_to_set(:members, "Dave")
|
10
|
+
#
|
11
|
+
# @param [ String, Symbol ] field The name of the field to add to.
|
12
|
+
# @param [ Object ] value The single value to add.
|
13
|
+
#
|
14
|
+
# @return [ nil ] Nil.
|
15
|
+
#
|
16
|
+
# @since 3.0.0
|
17
|
+
def add_to_set(field, value)
|
18
|
+
query.update_all("$addToSet" => { field => value })
|
19
|
+
end
|
20
|
+
|
21
|
+
# Perform an atomic $bit operation on the matching documents.
|
22
|
+
#
|
23
|
+
# @example Perform the bitwise op.
|
24
|
+
# context.bit(:likes, { and: 14, or: 4 })
|
25
|
+
#
|
26
|
+
# @param [ String, Symbol ] field The name of the field to operate on.
|
27
|
+
# @param [ Hash ] value The bitwise operations to perform. Keys may be
|
28
|
+
# "and" or "or" and must have numeric values.
|
29
|
+
#
|
30
|
+
# @return [ nil ] Nil.
|
31
|
+
#
|
32
|
+
# @since 3.0.0
|
33
|
+
def bit(field, value)
|
34
|
+
query.update_all("$bit" => { field => value })
|
35
|
+
end
|
36
|
+
|
37
|
+
# Perform an atomic $inc operation on the matching documents.
|
38
|
+
#
|
39
|
+
# @example Perform the atomic increment.
|
40
|
+
# context.inc(:likes, 10)
|
41
|
+
#
|
42
|
+
# @param [ String, Symbol ] field The field to increment.
|
43
|
+
# @param [ Integer ] value The amount to increment by.
|
44
|
+
#
|
45
|
+
# @return [ nil ] Nil.
|
46
|
+
#
|
47
|
+
# @since 3.0.0
|
48
|
+
def inc(field, value)
|
49
|
+
query.update_all("$inc" => { field => value })
|
50
|
+
end
|
51
|
+
|
52
|
+
# Perform an atomic $pop operation on the matching documents.
|
53
|
+
#
|
54
|
+
# @example Pop the first value on the matches.
|
55
|
+
# context.pop(:members, -1)
|
56
|
+
#
|
57
|
+
# @example Pop the last value on the matches.
|
58
|
+
# context.pop(:members, 1)
|
59
|
+
#
|
60
|
+
# @param [ String, Symbol ] field The name of the array field to pop
|
61
|
+
# from.
|
62
|
+
# @param [ Integer ] value 1 to pop from the end, -1 to pop from the
|
63
|
+
# front.
|
64
|
+
#
|
65
|
+
# @return [ nil ] Nil.
|
66
|
+
#
|
67
|
+
# @since 3.0.0
|
68
|
+
def pop(field, value)
|
69
|
+
query.update_all("$pop" => { field => value })
|
70
|
+
end
|
71
|
+
|
72
|
+
# Perform an atomic $pull operation on the matching documents.
|
73
|
+
#
|
74
|
+
# @example Pull the value from the matches.
|
75
|
+
# context.pull(:members, "Dave")
|
76
|
+
#
|
77
|
+
# @note Expression pulling is not yet supported.
|
78
|
+
#
|
79
|
+
# @param [ String, Symbol ] field The field to pull from.
|
80
|
+
# @param [ Object ] value The single value to pull.
|
81
|
+
#
|
82
|
+
# @return [ nil ] Nil.
|
83
|
+
#
|
84
|
+
# @since 3.0.0
|
85
|
+
def pull(field, value)
|
86
|
+
query.update_all("$pull" => { field => value })
|
87
|
+
end
|
88
|
+
|
89
|
+
# Perform an atomic $pullAll operation on the matching documents.
|
90
|
+
#
|
91
|
+
# @example Pull all the matching values from the matches.
|
92
|
+
# context.pull_all(:members, [ "Alan", "Vince" ])
|
93
|
+
#
|
94
|
+
# @param [ String, Symbol ] field The field to pull from.
|
95
|
+
# @param [ Array<Object> ] values The values to pull.
|
96
|
+
#
|
97
|
+
# @return [ nil ] Nil.
|
98
|
+
#
|
99
|
+
# @since 3.0.0
|
100
|
+
def pull_all(field, values)
|
101
|
+
query.update_all("$pullAll" => { field => values })
|
102
|
+
end
|
103
|
+
|
104
|
+
# Perform an atomic $push operation on the matching documents.
|
105
|
+
#
|
106
|
+
# @example Push the value to the matching docs.
|
107
|
+
# context.push(:members, "Alan")
|
108
|
+
#
|
109
|
+
# @param [ String, Symbol ] field The field to push to.
|
110
|
+
# @param [ Object ] value The value to push.
|
111
|
+
#
|
112
|
+
# @return [ nil ] Nil.
|
113
|
+
#
|
114
|
+
# @since 3.0.0
|
115
|
+
def push(field, value)
|
116
|
+
query.update_all("$push" => { field => value })
|
117
|
+
end
|
118
|
+
|
119
|
+
# Perform an atomic $pushAll operation on the matching documents.
|
120
|
+
#
|
121
|
+
# @example Push the values to the matching docs.
|
122
|
+
# context.push(:members, [ "Alan", "Fletch" ])
|
123
|
+
#
|
124
|
+
# @param [ String, Symbol ] field The field to push to.
|
125
|
+
# @param [ Array<Object> ] values The values to push.
|
126
|
+
#
|
127
|
+
# @return [ nil ] Nil.
|
128
|
+
#
|
129
|
+
# @since 3.0.0
|
130
|
+
def push_all(field, values)
|
131
|
+
query.update_all("$pushAll" => { field => values })
|
132
|
+
end
|
133
|
+
|
134
|
+
# Perform an atomic $rename of fields on the matching documents.
|
135
|
+
#
|
136
|
+
# @example Rename the fields on the matching documents.
|
137
|
+
# context.rename(:members, :artists)
|
138
|
+
#
|
139
|
+
# @param [ String, Symbol ] old_name The old field name.
|
140
|
+
# @param [ String, Symbol ] new_name The new field name.
|
141
|
+
#
|
142
|
+
# @return [ nil ] Nil.
|
143
|
+
#
|
144
|
+
# @since 3.0.0
|
145
|
+
def rename(old_name, new_name)
|
146
|
+
query.update_all("$rename" => { old_name.to_s => new_name.to_s })
|
147
|
+
end
|
148
|
+
|
149
|
+
# Perform an atomic $set of fields on the matching documents.
|
150
|
+
#
|
151
|
+
# @example Set the field value on the matches.
|
152
|
+
# context.set(:name, "Depeche Mode")
|
153
|
+
#
|
154
|
+
# @param [ String, Symbol ] field The name of the field.
|
155
|
+
# @param [ Object ] value The value to set.
|
156
|
+
#
|
157
|
+
# @return [ nil ] Nil.
|
158
|
+
#
|
159
|
+
# @since 3.0.0
|
160
|
+
def set(field, value)
|
161
|
+
query.update_all("$set" => { field => value })
|
162
|
+
end
|
163
|
+
|
164
|
+
# Perform an atomic $unset of a field on the matching documents.
|
165
|
+
#
|
166
|
+
# @example Unset the field on the matches.
|
167
|
+
# context.unset(:name)
|
168
|
+
#
|
169
|
+
# @param [ String, Symbol ] field The name of the field.
|
170
|
+
#
|
171
|
+
# @return [ nil ] Nil.
|
172
|
+
#
|
173
|
+
# @since 3.0.0
|
174
|
+
def unset(field)
|
175
|
+
query.update_all("$unset" => { field => true })
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Contextual
|
4
|
+
module Command
|
5
|
+
|
6
|
+
# The database command that is being built to send to the db.
|
7
|
+
#
|
8
|
+
# @example Get the command.
|
9
|
+
# command.command
|
10
|
+
#
|
11
|
+
# @return [ Hash ] The db command.
|
12
|
+
#
|
13
|
+
# @since 3.0.0
|
14
|
+
def command
|
15
|
+
@command ||= {}
|
16
|
+
end
|
17
|
+
|
18
|
+
# Get the criteria for the command.
|
19
|
+
#
|
20
|
+
# @example Get the criteria.
|
21
|
+
# command.criteria
|
22
|
+
#
|
23
|
+
# @return [ Criteria ] The criteria.
|
24
|
+
#
|
25
|
+
# @since 3.0.0
|
26
|
+
def criteria
|
27
|
+
@criteria
|
28
|
+
end
|
29
|
+
|
30
|
+
# Get the database session.
|
31
|
+
#
|
32
|
+
# @example Get the session.
|
33
|
+
# command.session
|
34
|
+
#
|
35
|
+
# @return [ Session ] The Moped session.
|
36
|
+
#
|
37
|
+
# @since 3.0.0
|
38
|
+
def session
|
39
|
+
criteria.klass.mongo_session
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Contextual
|
4
|
+
class FindAndModify
|
5
|
+
include Command
|
6
|
+
|
7
|
+
# Initialize the find and modify command, used for MongoDB's
|
8
|
+
# $findAndModify.
|
9
|
+
#
|
10
|
+
# @example Initialize the command.
|
11
|
+
# FindAndModify.new(criteria, { "$set" => { likes: 1 }})
|
12
|
+
#
|
13
|
+
# @param [ Criteria ] criteria The criteria.
|
14
|
+
# @param [ Hash ] update The updates.
|
15
|
+
# @param [ Hash ] options The command options.
|
16
|
+
#
|
17
|
+
# @option options [ true, false ] :new Return the updated document.
|
18
|
+
# @option options [ true, false ] :remove Delete the first document.
|
19
|
+
#
|
20
|
+
# @since 3.0.0
|
21
|
+
def initialize(criteria, update, options = {})
|
22
|
+
@criteria = criteria
|
23
|
+
command[:findandmodify] = criteria.klass.collection_name.to_s
|
24
|
+
command[:update] = update unless options[:remove]
|
25
|
+
command.merge!(options)
|
26
|
+
apply_criteria_options
|
27
|
+
end
|
28
|
+
|
29
|
+
# Get the result of the $findAndModify.
|
30
|
+
#
|
31
|
+
# @example Get the result.
|
32
|
+
# find_and_modify.result
|
33
|
+
#
|
34
|
+
# @return [ Hash ] The result of the command.
|
35
|
+
#
|
36
|
+
# @since 3.0.0
|
37
|
+
def result
|
38
|
+
session.with(consistency: :strong) do |session|
|
39
|
+
session.command(command)["value"]
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
# Apply criteria specific options - query, sort, fields.
|
46
|
+
#
|
47
|
+
# @api private
|
48
|
+
#
|
49
|
+
# @example Apply the criteria options
|
50
|
+
# map_reduce.apply_criteria_options
|
51
|
+
#
|
52
|
+
# @return [ nil ] Nothing.
|
53
|
+
#
|
54
|
+
# @since 3.0.0
|
55
|
+
def apply_criteria_options
|
56
|
+
command[:query] = criteria.selector
|
57
|
+
if sort = criteria.options[:sort]
|
58
|
+
command[:sort] = sort
|
59
|
+
end
|
60
|
+
if fields = criteria.options[:fields]
|
61
|
+
command[:fields] = fields
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,273 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Contextual
|
4
|
+
class MapReduce
|
5
|
+
include Enumerable
|
6
|
+
include Command
|
7
|
+
|
8
|
+
delegate :[], to: :results
|
9
|
+
delegate :==, :empty?, :inspect, to: :entries
|
10
|
+
|
11
|
+
# Get all the counts returned by the map/reduce.
|
12
|
+
#
|
13
|
+
# @example Get the counts.
|
14
|
+
# map_reduce.counts
|
15
|
+
#
|
16
|
+
# @return [ Hash ] The counts.
|
17
|
+
#
|
18
|
+
# @since 3.0.0
|
19
|
+
def counts
|
20
|
+
results["counts"]
|
21
|
+
end
|
22
|
+
|
23
|
+
# Iterates over each of the documents in the map/reduce, excluding the
|
24
|
+
# extra information that was passed back from the database.
|
25
|
+
#
|
26
|
+
# @example Iterate over the results.
|
27
|
+
# map_reduce.each do |doc|
|
28
|
+
# p doc
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# @return [ Enumerator ] The enumerator.
|
32
|
+
#
|
33
|
+
# @since 3.0.0
|
34
|
+
def each
|
35
|
+
if block_given?
|
36
|
+
documents.each do |doc|
|
37
|
+
yield doc
|
38
|
+
end
|
39
|
+
else
|
40
|
+
to_enum
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Get the number of documents emitted by the map/reduce.
|
45
|
+
#
|
46
|
+
# @example Get the emitted document count.
|
47
|
+
# map_reduce.emitted
|
48
|
+
#
|
49
|
+
# @return [ Integer ] The number of emitted documents.
|
50
|
+
#
|
51
|
+
# @since 3.0.0
|
52
|
+
def emitted
|
53
|
+
counts["emit"]
|
54
|
+
end
|
55
|
+
|
56
|
+
# Provide a finalize js function for the map/reduce.
|
57
|
+
#
|
58
|
+
# @example Provide a finalize function.
|
59
|
+
# map_reduce.finalize(func)
|
60
|
+
#
|
61
|
+
# @param [ String ] function The finalize function.
|
62
|
+
#
|
63
|
+
# @return [ MapReduce ] The map reduce.
|
64
|
+
#
|
65
|
+
# @since 3.0.0
|
66
|
+
def finalize(function)
|
67
|
+
command[:finalize] = function
|
68
|
+
self
|
69
|
+
end
|
70
|
+
|
71
|
+
# Initialize the new map/reduce directive.
|
72
|
+
#
|
73
|
+
# @example Initialize the new map/reduce.
|
74
|
+
# MapReduce.new(criteria, map, reduce)
|
75
|
+
#
|
76
|
+
# @param [ Criteria ] criteria The Mongoid criteria.
|
77
|
+
# @param [ String ] map The map js function.
|
78
|
+
# @param [ String ] reduce The reduce js function.
|
79
|
+
#
|
80
|
+
# @since 3.0.0
|
81
|
+
def initialize(criteria, map, reduce)
|
82
|
+
@criteria = criteria
|
83
|
+
command[:mapreduce] = criteria.klass.collection_name.to_s
|
84
|
+
command[:map], command[:reduce] = map, reduce
|
85
|
+
apply_criteria_options
|
86
|
+
end
|
87
|
+
|
88
|
+
# Get the number of documents that were input into the map/reduce.
|
89
|
+
#
|
90
|
+
# @example Get the count of input documents.
|
91
|
+
# map_reduce.input
|
92
|
+
#
|
93
|
+
# @return [ Integer ] The number of input documents.
|
94
|
+
#
|
95
|
+
# @since 3.0.0
|
96
|
+
def input
|
97
|
+
counts["input"]
|
98
|
+
end
|
99
|
+
|
100
|
+
# Sets the map/reduce to use jsMode.
|
101
|
+
#
|
102
|
+
# @example Set the map/reduce to jsMode.
|
103
|
+
# map_reduce.js_mode
|
104
|
+
#
|
105
|
+
# @return [ MapReduce ] The map/reduce.
|
106
|
+
#
|
107
|
+
# @since 3.0.0
|
108
|
+
def js_mode
|
109
|
+
command[:jsMode] = true
|
110
|
+
self
|
111
|
+
end
|
112
|
+
|
113
|
+
# Specifies where the map/reduce output is to be stored.
|
114
|
+
#
|
115
|
+
# @example Store output in memory.
|
116
|
+
# map_reduce.out(inline: 1)
|
117
|
+
#
|
118
|
+
# @example Store output in a collection, replacing existing documents.
|
119
|
+
# map_reduce.out(replace: "collection_name")
|
120
|
+
#
|
121
|
+
# @example Store output in a collection, merging existing documents.
|
122
|
+
# map_reduce.out(merge: "collection_name")
|
123
|
+
#
|
124
|
+
# @example Store output in a collection, reducing existing documents.
|
125
|
+
# map_reduce.out(reduce: "collection_name")
|
126
|
+
#
|
127
|
+
# @param [ Hash ] location The place to store the results.
|
128
|
+
#
|
129
|
+
# @return [ MapReduce ] The map/reduce object.
|
130
|
+
#
|
131
|
+
# @since 3.0.0
|
132
|
+
def out(location)
|
133
|
+
normalized = location.dup
|
134
|
+
normalized.update_values do |value|
|
135
|
+
value.is_a?(::Symbol) ? value.to_s : value
|
136
|
+
end
|
137
|
+
command[:out] = normalized
|
138
|
+
self
|
139
|
+
end
|
140
|
+
|
141
|
+
# Get the number of documents output by the map/reduce.
|
142
|
+
#
|
143
|
+
# @example Get the output document count.
|
144
|
+
# map_reduce.output
|
145
|
+
#
|
146
|
+
# @return [ Integer ] The number of output documents.
|
147
|
+
#
|
148
|
+
# @since 3.0.0
|
149
|
+
def output
|
150
|
+
counts["output"]
|
151
|
+
end
|
152
|
+
|
153
|
+
# Get the raw output from the map/reduce operation.
|
154
|
+
#
|
155
|
+
# @example Get the raw output.
|
156
|
+
# map_reduce.raw
|
157
|
+
#
|
158
|
+
# @return [ Hash ] The raw output.
|
159
|
+
#
|
160
|
+
# @since 3.0.0
|
161
|
+
def raw
|
162
|
+
results
|
163
|
+
end
|
164
|
+
|
165
|
+
# Get the number of documents reduced by the map/reduce.
|
166
|
+
#
|
167
|
+
# @example Get the reduced document count.
|
168
|
+
# map_reduce.reduced
|
169
|
+
#
|
170
|
+
# @return [ Integer ] The number of reduced documents.
|
171
|
+
#
|
172
|
+
# @since 3.0.0
|
173
|
+
def reduced
|
174
|
+
counts["reduce"]
|
175
|
+
end
|
176
|
+
|
177
|
+
# Adds a javascript object to the global scope of the map/reduce.
|
178
|
+
#
|
179
|
+
# @example Add an object to the global scope.
|
180
|
+
# map_reduce.scope(name: value)
|
181
|
+
#
|
182
|
+
# @param [ Hash ] object A hash of key/values for the global scope.
|
183
|
+
#
|
184
|
+
# @return [ MapReduce ]
|
185
|
+
#
|
186
|
+
# @since 3.0.0
|
187
|
+
def scope(object)
|
188
|
+
command[:scope] = object
|
189
|
+
self
|
190
|
+
end
|
191
|
+
|
192
|
+
# Get the execution time of the map/reduce.
|
193
|
+
#
|
194
|
+
# @example Get the execution time.
|
195
|
+
# map_reduce.time
|
196
|
+
#
|
197
|
+
# @return [ Float ] The time in milliseconds.
|
198
|
+
#
|
199
|
+
# @since 3.0.0
|
200
|
+
def time
|
201
|
+
results["timeMillis"]
|
202
|
+
end
|
203
|
+
|
204
|
+
private
|
205
|
+
|
206
|
+
# Apply criteria specific options - query, sort, limit.
|
207
|
+
#
|
208
|
+
# @api private
|
209
|
+
#
|
210
|
+
# @example Apply the criteria options
|
211
|
+
# map_reduce.apply_criteria_options
|
212
|
+
#
|
213
|
+
# @return [ nil ] Nothing.
|
214
|
+
#
|
215
|
+
# @since 3.0.0
|
216
|
+
def apply_criteria_options
|
217
|
+
command[:query] = criteria.selector
|
218
|
+
if sort = criteria.options[:sort]
|
219
|
+
command[:orderby] = sort
|
220
|
+
end
|
221
|
+
if limit = criteria.options[:limit]
|
222
|
+
command[:limit] = limit
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
# Get the result documents from the map/reduce. If the output was inline
|
227
|
+
# then we grab them from the results key. If the output was a temp
|
228
|
+
# collection then we need to execute a find on that collection.
|
229
|
+
#
|
230
|
+
# @api private
|
231
|
+
#
|
232
|
+
# @example Get the documents.
|
233
|
+
# map_reduce.documents
|
234
|
+
#
|
235
|
+
# @return [ Array, Cursor ] The documents.
|
236
|
+
#
|
237
|
+
# @since 3.0.0
|
238
|
+
def documents
|
239
|
+
return results["results"] if results.has_key?("results")
|
240
|
+
session[output_collection].find
|
241
|
+
end
|
242
|
+
|
243
|
+
# Get the collection that the map/reduce results were stored in.
|
244
|
+
#
|
245
|
+
# @api private
|
246
|
+
#
|
247
|
+
# @example Get the output collection.
|
248
|
+
# map_reduce.output_collection
|
249
|
+
#
|
250
|
+
# @return [ Symbol, String ] The output collection.
|
251
|
+
#
|
252
|
+
# @since 3.0.0
|
253
|
+
def output_collection
|
254
|
+
command[:out].values.first
|
255
|
+
end
|
256
|
+
|
257
|
+
# Execute the map/reduce command and get the results.
|
258
|
+
#
|
259
|
+
# @api private
|
260
|
+
#
|
261
|
+
# @example Get the results.
|
262
|
+
# map_reduce.results
|
263
|
+
#
|
264
|
+
# @return [ Hash ] The results of the command.
|
265
|
+
#
|
266
|
+
# @since 3.0.0
|
267
|
+
def results
|
268
|
+
raise Errors::NoMapReduceOutput.new(command) unless command[:out]
|
269
|
+
@results ||= session.command(command)
|
270
|
+
end
|
271
|
+
end
|
272
|
+
end
|
273
|
+
end
|