mongoid 2.1.9 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. data/CHANGELOG.md +281 -0
  2. data/{README.rdoc → README.md} +24 -14
  3. data/Rakefile +1 -1
  4. data/lib/config/locales/bg.yml +5 -0
  5. data/lib/config/locales/de.yml +5 -0
  6. data/lib/config/locales/en-GB.yml +5 -0
  7. data/lib/config/locales/en.yml +5 -0
  8. data/lib/config/locales/es.yml +3 -0
  9. data/lib/config/locales/fr.yml +5 -0
  10. data/lib/config/locales/hi.yml +5 -0
  11. data/lib/config/locales/hu.yml +5 -0
  12. data/lib/config/locales/id.yml +5 -0
  13. data/lib/config/locales/it.yml +5 -0
  14. data/lib/config/locales/ja.yml +5 -0
  15. data/lib/config/locales/kr.yml +5 -0
  16. data/lib/config/locales/nl.yml +5 -0
  17. data/lib/config/locales/pl.yml +5 -0
  18. data/lib/config/locales/pt-BR.yml +5 -0
  19. data/lib/config/locales/pt.yml +5 -0
  20. data/lib/config/locales/ro.yml +5 -0
  21. data/lib/config/locales/ru.yml +5 -0
  22. data/lib/config/locales/sv.yml +5 -0
  23. data/lib/config/locales/vi.yml +5 -0
  24. data/lib/config/locales/zh-CN.yml +5 -0
  25. data/lib/mongoid/atomic.rb +61 -10
  26. data/lib/mongoid/atomic/modifiers.rb +156 -24
  27. data/lib/mongoid/attributes.rb +38 -10
  28. data/lib/mongoid/collection.rb +21 -3
  29. data/lib/mongoid/collections.rb +52 -6
  30. data/lib/mongoid/collections/master.rb +8 -2
  31. data/lib/mongoid/collections/operations.rb +1 -0
  32. data/lib/mongoid/config.rb +5 -2
  33. data/lib/mongoid/config/database.rb +15 -2
  34. data/lib/mongoid/contexts/mongo.rb +3 -0
  35. data/lib/mongoid/criteria.rb +27 -3
  36. data/lib/mongoid/criterion/inclusion.rb +58 -0
  37. data/lib/mongoid/dirty.rb +2 -0
  38. data/lib/mongoid/document.rb +23 -0
  39. data/lib/mongoid/errors.rb +3 -0
  40. data/lib/mongoid/errors/callback.rb +26 -0
  41. data/lib/mongoid/errors/eager_load.rb +25 -0
  42. data/lib/mongoid/errors/invalid_find.rb +19 -0
  43. data/lib/mongoid/extensions.rb +3 -1
  44. data/lib/mongoid/extensions/object_id/conversions.rb +1 -1
  45. data/lib/mongoid/extras.rb +12 -2
  46. data/lib/mongoid/fields.rb +41 -2
  47. data/lib/mongoid/fields/serializable.rb +36 -0
  48. data/lib/mongoid/fields/serializable/foreign_keys/array.rb +13 -14
  49. data/lib/mongoid/fields/serializable/foreign_keys/object.rb +13 -14
  50. data/lib/mongoid/finders.rb +4 -4
  51. data/lib/mongoid/identity_map.rb +33 -20
  52. data/lib/mongoid/keys.rb +24 -1
  53. data/lib/mongoid/nested_attributes.rb +16 -4
  54. data/lib/mongoid/persistence.rb +50 -6
  55. data/lib/mongoid/persistence/operations.rb +1 -4
  56. data/lib/mongoid/persistence/operations/update.rb +3 -1
  57. data/lib/mongoid/relations/builders/nested_attributes/many.rb +27 -44
  58. data/lib/mongoid/relations/builders/referenced/many.rb +2 -1
  59. data/lib/mongoid/relations/builders/referenced/one.rb +1 -1
  60. data/lib/mongoid/relations/cascading.rb +12 -1
  61. data/lib/mongoid/relations/embedded/many.rb +11 -4
  62. data/lib/mongoid/relations/embedded/one.rb +6 -2
  63. data/lib/mongoid/relations/macros.rb +19 -12
  64. data/lib/mongoid/relations/metadata.rb +17 -0
  65. data/lib/mongoid/relations/polymorphic.rb +12 -1
  66. data/lib/mongoid/relations/proxy.rb +24 -0
  67. data/lib/mongoid/relations/referenced/in.rb +20 -0
  68. data/lib/mongoid/relations/referenced/many.rb +30 -6
  69. data/lib/mongoid/relations/referenced/many_to_many.rb +18 -2
  70. data/lib/mongoid/relations/referenced/one.rb +19 -0
  71. data/lib/mongoid/relations/reflections.rb +23 -3
  72. data/lib/mongoid/relations/targets/enumerable.rb +29 -1
  73. data/lib/mongoid/serialization.rb +1 -1
  74. data/lib/mongoid/sharding.rb +12 -2
  75. data/lib/mongoid/threaded.rb +98 -0
  76. data/lib/mongoid/version.rb +1 -1
  77. data/lib/mongoid/versioning.rb +12 -2
  78. metadata +25 -21
@@ -4,8 +4,13 @@ hu:
4
4
  messages:
5
5
  taken:
6
6
  már foglalt
7
+ callbacks:
8
+ "Calling %{method} on %{klass} resulted in a false return from a callback."
7
9
  document_not_found:
8
10
  "%{klass} osztályban, %{identifiers} id(k)-el nem található dokumentum."
11
+ eager_load:
12
+ "Eager loading :%{name} is not supported due to it being a many-to-many
13
+ or polymorphic belongs_to relation."
9
14
  invalid_database:
10
15
  Az adatbázisnak Mongo::DB-nek kellene lennie, nem %{name}.
11
16
  invalid_type:
@@ -4,8 +4,13 @@ id:
4
4
  messages:
5
5
  taken:
6
6
  telah digunakan
7
+ callbacks:
8
+ "Calling %{method} on %{klass} resulted in a false return from a callback."
7
9
  document_not_found:
8
10
  Dokumen tidak ditemukan untuk kelas %{klass} dengan id %{identifiers}.
11
+ eager_load:
12
+ "Eager loading :%{name} is not supported due to it being a many-to-many
13
+ or polymorphic belongs_to relation."
9
14
  invalid_database:
10
15
  Database harus Mongo::DB, bukan %{name}.
11
16
  invalid_type:
@@ -4,8 +4,13 @@ it:
4
4
  messages:
5
5
  taken:
6
6
  è già utilizzato
7
+ callbacks:
8
+ "Calling %{method} on %{klass} resulted in a false return from a callback."
7
9
  document_not_found:
8
10
  Documento non trovato per la classe %{klass} con id(s) %{identifiers}.
11
+ eager_load:
12
+ "Eager loading :%{name} is not supported due to it being a many-to-many
13
+ or polymorphic belongs_to relation."
9
14
  invalid_database:
10
15
  Il database dovrebbe essere un Mongo::DB, non %{name}.
11
16
  invalid_type:
@@ -4,8 +4,13 @@ ja:
4
4
  messages:
5
5
  taken:
6
6
  はすでに使用されています
7
+ callbacks:
8
+ "Calling %{method} on %{klass} resulted in a false return from a callback."
7
9
  document_not_found:
8
10
  次のDocumentは見つかりませんでした。class %{klass} with id(s) %{identifiers}
11
+ eager_load:
12
+ "Eager loading :%{name} is not supported due to it being a many-to-many
13
+ or polymorphic belongs_to relation."
9
14
  invalid_database:
10
15
  次のDatabaseは利用できませんでした。%{name}
11
16
  invalid_type:
@@ -4,8 +4,13 @@ kr:
4
4
  messages:
5
5
  taken:
6
6
  이미 사용하고있습니다
7
+ callbacks:
8
+ "Calling %{method} on %{klass} resulted in a false return from a callback."
7
9
  document_not_found:
8
10
  클라스 %{klass}와 id를 %{identifiers} 위한 문서를 찾을수 없습니다.
11
+ eager_load:
12
+ "Eager loading :%{name} is not supported due to it being a many-to-many
13
+ or polymorphic belongs_to relation."
9
14
  invalid_database:
10
15
  데이타베이스가 Mongo::DB이어야 합니다, %{name}이면 안됩니다.
11
16
  invalid_type:
@@ -4,8 +4,13 @@ nl:
4
4
  messages:
5
5
  taken:
6
6
  al in gebruik
7
+ callbacks:
8
+ "Calling %{method} on %{klass} resulted in a false return from a callback."
7
9
  document_not_found:
8
10
  Document niet gevonden voor class %{klass} met de id(s) %{identifiers}.
11
+ eager_load:
12
+ "Eager loading :%{name} is not supported due to it being a many-to-many
13
+ or polymorphic belongs_to relation."
9
14
  invalid_database:
10
15
  Database moet een Mongo::DB zijn, niet een %{name}.
11
16
  invalid_type:
@@ -4,8 +4,13 @@ pl:
4
4
  messages:
5
5
  taken:
6
6
  jest już zajęte
7
+ callbacks:
8
+ "Calling %{method} on %{klass} resulted in a false return from a callback."
7
9
  document_not_found:
8
10
  Nie znaleziono dokumentu dla klasy %{klass} o id %{identifiers}.
11
+ eager_load:
12
+ "Eager loading :%{name} is not supported due to it being a many-to-many
13
+ or polymorphic belongs_to relation."
9
14
  invalid_database:
10
15
  Baza danych powinna być typu Mongo::DB, a nie %{name}.
11
16
  invalid_type:
@@ -4,8 +4,13 @@ pt-BR:
4
4
  messages:
5
5
  taken:
6
6
  já está utilizada
7
+ callbacks:
8
+ "Calling %{method} on %{klass} resulted in a false return from a callback."
7
9
  document_not_found:
8
10
  Nenhum documento encontrado para a classe %{klass} com os id(s) %{identifiers}.
11
+ eager_load:
12
+ "Eager loading :%{name} is not supported due to it being a many-to-many
13
+ or polymorphic belongs_to relation."
9
14
  invalid_database:
10
15
  A base de dados deverá ser uma Mongo::DB, em vez de %{name}.
11
16
  invalid_type:
@@ -4,8 +4,13 @@ pt:
4
4
  messages:
5
5
  taken:
6
6
  já está utilizada
7
+ callbacks:
8
+ "Calling %{method} on %{klass} resulted in a false return from a callback."
7
9
  document_not_found:
8
10
  Nenhum documento encontrado para a classe %{klass} com os id(s) %{identifiers}.
11
+ eager_load:
12
+ "Eager loading :%{name} is not supported due to it being a many-to-many
13
+ or polymorphic belongs_to relation."
9
14
  invalid_database:
10
15
  A base de dados deverá ser uma Mongo::DB, em vez de %{name}.
11
16
  invalid_type:
@@ -4,8 +4,13 @@ ro:
4
4
  messages:
5
5
  taken:
6
6
  este deja folosit
7
+ callbacks:
8
+ "Calling %{method} on %{klass} resulted in a false return from a callback."
7
9
  document_not_found:
8
10
  Nu există document în clasa %{klass} cu id %{identifiers}.
11
+ eager_load:
12
+ "Eager loading :%{name} is not supported due to it being a many-to-many
13
+ or polymorphic belongs_to relation."
9
14
  invalid_database:
10
15
  Baza de date ar trebui să fie de tipul Mongo::DB, nu %{name}.
11
16
  invalid_type:
@@ -4,8 +4,13 @@ ru:
4
4
  messages:
5
5
  taken:
6
6
  уже занят
7
+ callbacks:
8
+ "Calling %{method} on %{klass} resulted in a false return from a callback."
7
9
  document_not_found:
8
10
  Документ класса %{klass} с id %{identifiers} не найден.
11
+ eager_load:
12
+ "Eager loading :%{name} is not supported due to it being a many-to-many
13
+ or polymorphic belongs_to relation."
9
14
  invalid_database:
10
15
  База данных должна быть Mongo::DB, а не %{name}.
11
16
  invalid_type:
@@ -4,8 +4,13 @@ sv:
4
4
  messages:
5
5
  taken:
6
6
  har redan använts
7
+ callbacks:
8
+ "Calling %{method} on %{klass} resulted in a false return from a callback."
7
9
  document_not_found:
8
10
  Inget dokument kunde hittas för klass %{klass} med id %{identifiers}.
11
+ eager_load:
12
+ "Eager loading :%{name} is not supported due to it being a many-to-many
13
+ or polymorphic belongs_to relation."
9
14
  invalid_database:
10
15
  Databasen bör vara Mongo::DB, inte %{name}.
11
16
  invalid_type:
@@ -4,8 +4,13 @@ vi:
4
4
  messages:
5
5
  taken:
6
6
  đã bị lấy
7
+ callbacks:
8
+ "Calling %{method} on %{klass} resulted in a false return from a callback."
7
9
  document_not_found:
8
10
  Không tìm thấy văn bản cho lớp %{klass} với định danh %{identifiers}.
11
+ eager_load:
12
+ "Eager loading :%{name} is not supported due to it being a many-to-many
13
+ or polymorphic belongs_to relation."
9
14
  invalid_database:
10
15
  Cơ sở dữ liệu nên là Mongo::DB, không phải %{name}.
11
16
  invalid_type:
@@ -4,10 +4,15 @@ zh-CN:
4
4
  messages:
5
5
  blank:
6
6
  不能为空
7
+ callbacks:
8
+ "Calling %{method} on %{klass} resulted in a false return from a callback."
7
9
  taken:
8
10
  已占用
9
11
  document_not_found:
10
12
  没有发现类是%{klass}id(s)是%{identifiers}的文档
13
+ eager_load:
14
+ "Eager loading :%{name} is not supported due to it being a many-to-many
15
+ or polymorphic belongs_to relation."
11
16
  invalid_database:
12
17
  数据库应该是Mongo::DB,而不是%{name}.
13
18
  invalid_type:
@@ -41,10 +41,9 @@ module Mongoid #:nodoc:
41
41
  # @since 2.1.0
42
42
  def atomic_updates
43
43
  Modifiers.new.tap do |mods|
44
- mods.set(atomic_sets)
44
+ generate_atomic_updates(mods, self)
45
45
  _children.each do |child|
46
- mods.set(child.atomic_sets)
47
- mods.push(child.atomic_pushes)
46
+ generate_atomic_updates(mods, child)
48
47
  end
49
48
  end
50
49
  end
@@ -54,7 +53,7 @@ module Mongoid #:nodoc:
54
53
  # documents, $unset on embeds_one, $set on embeds_many.
55
54
  #
56
55
  # @example Get the removal operator.
57
- # name.remover
56
+ # name.atomic_delete_modifier
58
57
  #
59
58
  # @return [ String ] The pull or unset operation.
60
59
  def atomic_delete_modifier
@@ -65,7 +64,7 @@ module Mongoid #:nodoc:
65
64
  # documents, $set on embeds_one, $push on embeds_many.
66
65
  #
67
66
  # @example Get the insert operation.
68
- # name.inserter
67
+ # name.atomic_insert_modifier
69
68
  #
70
69
  # @return [ String ] The pull or set operator.
71
70
  def atomic_insert_modifier
@@ -76,7 +75,7 @@ module Mongoid #:nodoc:
76
75
  # updates via $set in MongoDB.
77
76
  #
78
77
  # @example Get the path to this document.
79
- # address.path
78
+ # address.atomic_path
80
79
  #
81
80
  # @return [ String ] The path to the document in the database.
82
81
  def atomic_path
@@ -86,17 +85,41 @@ module Mongoid #:nodoc:
86
85
  # Returns the positional operator of this document for modification.
87
86
  #
88
87
  # @example Get the positional operator.
89
- # address.position
88
+ # address.atomic_position
90
89
  #
91
90
  # @return [ String ] The positional operator with indexes.
92
91
  def atomic_position
93
92
  atomic_paths.position
94
93
  end
95
94
 
95
+ # Get all the attributes that need to be pulled.
96
+ #
97
+ # @example Get the pulls.
98
+ # person.atomic_pulls
99
+ #
100
+ # @return [ Array<Hash> ] The $pullAll operations.
101
+ #
102
+ # @since 2.2.0
103
+ def atomic_pulls
104
+ @atomic_pulls ||= {}
105
+ end
106
+
107
+ # Add the document as an atomic pull.
108
+ #
109
+ # @example Add the atomic pull.
110
+ # person.add_atomic_pull(address)
111
+ #
112
+ # @param [ Document ] The embedded document to pull.
113
+ #
114
+ # @since 2.2.0
115
+ def add_atomic_pull(document)
116
+ (atomic_pulls[document.atomic_path] ||= []).push(document.as_document)
117
+ end
118
+
96
119
  # Get all the push attributes that need to occur.
97
120
  #
98
121
  # @example Get the pushes.
99
- # person._pushes
122
+ # person.atomic_pushes
100
123
  #
101
124
  # @return [ Hash ] The $pushAll operations.
102
125
  #
@@ -109,7 +132,7 @@ module Mongoid #:nodoc:
109
132
  # with MongoDB's $ operator.
110
133
  #
111
134
  # @example Get the selector.
112
- # address.selector
135
+ # address.atomic_selector
113
136
  #
114
137
  # @return [ String ] The exact selector for this document.
115
138
  def atomic_selector
@@ -119,7 +142,7 @@ module Mongoid #:nodoc:
119
142
  # Get all the attributes that need to be set.
120
143
  #
121
144
  # @example Get the sets.
122
- # person._sets
145
+ # person.atomic_sets
123
146
  #
124
147
  # @return [ Hash ] The $set operations.
125
148
  #
@@ -128,6 +151,18 @@ module Mongoid #:nodoc:
128
151
  updateable? ? setters : settable? ? { atomic_path => as_document } : {}
129
152
  end
130
153
 
154
+ # Get all the attributes that need to be unset.
155
+ #
156
+ # @example Get the unsets.
157
+ # person.atomic_unsets
158
+ #
159
+ # @return [ Array<Hash> ] The $unset operations.
160
+ #
161
+ # @since 2.2.0
162
+ def atomic_unsets
163
+ @atomic_unsets ||= []
164
+ end
165
+
131
166
  private
132
167
 
133
168
  # Get the atomic paths utility for this document.
@@ -141,5 +176,21 @@ module Mongoid #:nodoc:
141
176
  def atomic_paths
142
177
  @atomic_paths ||= metadata ? metadata.path(self) : Atomic::Paths::Root.new(self)
143
178
  end
179
+
180
+ # Generates the atomic updates in the correct order.
181
+ #
182
+ # @example Generate the updates.
183
+ # model.generate_atomic_updates(mods, doc)
184
+ #
185
+ # @param [ Modifiers ] mods The atomic modifications.
186
+ # @param [ Document ] doc The document to update for.
187
+ #
188
+ # @since 2.2.0
189
+ def generate_atomic_updates(mods, doc)
190
+ mods.unset(doc.atomic_unsets)
191
+ mods.pull(doc.atomic_pulls)
192
+ mods.set(doc.atomic_sets)
193
+ mods.push(doc.atomic_pushes)
194
+ end
144
195
  end
145
196
  end
@@ -6,6 +6,21 @@ module Mongoid #:nodoc:
6
6
  # database.
7
7
  class Modifiers < Hash
8
8
 
9
+ # Adds pull modifiers to the modifiers hash.
10
+ #
11
+ # @example Add pull operations.
12
+ # modifiers.pull({ "addresses" => { "street" => "Bond" }})
13
+ #
14
+ # @param [ Hash ] modifications The pull modifiers.
15
+ #
16
+ # @since 2.2.0
17
+ def pull(modifications)
18
+ modifications.each_pair do |field, value|
19
+ add_operation(pulls, field, value)
20
+ pull_fields << field.split(".", 2)[0]
21
+ end
22
+ end
23
+
9
24
  # Adds push modifiers to the modifiers hash.
10
25
  #
11
26
  # @example Add push operations.
@@ -16,12 +31,8 @@ module Mongoid #:nodoc:
16
31
  # @since 2.1.0
17
32
  def push(modifications)
18
33
  modifications.each_pair do |field, value|
19
- mods = conflicting?(field) ? conflicts : pushes
20
- if mods.has_key?(field)
21
- mods[field].push(value)
22
- else
23
- mods[field] = [ value ]
24
- end
34
+ mods = push_conflict?(field) ? conflicting_pushes : pushes
35
+ add_operation(mods, field, Array.wrap(value))
25
36
  end
26
37
  end
27
38
 
@@ -36,26 +47,111 @@ module Mongoid #:nodoc:
36
47
  def set(modifications)
37
48
  modifications.each_pair do |field, value|
38
49
  next if field == "_id"
39
- sets.update(field => value)
40
- fields << field.split(".", 2)[0]
50
+ mods = set_conflict?(field) ? conflicting_sets : sets
51
+ add_operation(mods, field, value)
52
+ set_fields << field.split(".", 2)[0]
53
+ end
54
+ end
55
+
56
+ # Adds unset operations to the modifiers hash.
57
+ #
58
+ # @example Add unset operations.
59
+ # modifiers.unset([ "addresses" ])
60
+ #
61
+ # @param [ Array<String> ] modifications The unset relation names.
62
+ #
63
+ # @since 2.2.0
64
+ def unset(modifications)
65
+ modifications.each do |field|
66
+ unsets.update(field => true)
41
67
  end
42
68
  end
43
69
 
44
70
  private
45
71
 
46
- # Determines whether or not the provided field has a conflicting
47
- # modification with an already added $set operation.
72
+ # Add the operation to the modifications, either appending or creating a
73
+ # new one.
48
74
  #
49
- # @example Does the field conflict?
50
- # modifiers.conflicting?("addresses")
75
+ # @example Add the operation.
76
+ # modifications.add_operation(mods, field, value)
51
77
  #
52
- # @param [ String ] field The name of the field.
78
+ # @param [ Hash ] mods The modifications.
79
+ # @param [ String ] field The field.
80
+ # @param [ Hash ] value The atomic op.
53
81
  #
54
- # @return [ true, false ] If the field conflicts.
82
+ # @since 2.2.0
83
+ def add_operation(mods, field, value)
84
+ if mods.has_key?(field)
85
+ value.each do |val|
86
+ mods[field].push(val)
87
+ end
88
+ else
89
+ mods[field] = value
90
+ end
91
+ end
92
+
93
+ # Is the operation going to be a conflict for a $set?
55
94
  #
56
- # @since 2.1.0
57
- def conflicting?(field)
58
- fields.include?(field.split(".", 2)[0])
95
+ # @example Is this a conflict for a set?
96
+ # modifiers.set_conflict?(field)
97
+ #
98
+ # @param [ String ] field The field.
99
+ #
100
+ # @return [ true, false ] If this field is a conflict.
101
+ #
102
+ # @since 2.2.0
103
+ def set_conflict?(field)
104
+ pull_fields.include?(field.split(".", 2)[0])
105
+ end
106
+
107
+ # Is the operation going to be a conflict for a $push?
108
+ #
109
+ # @example Is this a conflict for a push?
110
+ # modifiers.push_conflict?(field)
111
+ #
112
+ # @param [ String ] field The field.
113
+ #
114
+ # @return [ true, false ] If this field is a conflict.
115
+ #
116
+ # @since 2.2.0
117
+ def push_conflict?(field)
118
+ set_fields.include?(field.split(".", 2)[0])
119
+ end
120
+
121
+ # Get the conflicting pull modifications.
122
+ #
123
+ # @example Get the conflicting pulls.
124
+ # modifiers.conflicting_pulls
125
+ #
126
+ # @return [ Hash ] The conflicting pull operations.
127
+ #
128
+ # @since 2.2.0
129
+ def conflicting_pulls
130
+ conflicts["$pullAll"] ||= {}
131
+ end
132
+
133
+ # Get the conflicting push modifications.
134
+ #
135
+ # @example Get the conflicting pushs.
136
+ # modifiers.conflicting_pushs
137
+ #
138
+ # @return [ Hash ] The conflicting push operations.
139
+ #
140
+ # @since 2.2.0
141
+ def conflicting_pushes
142
+ conflicts["$pushAll"] ||= {}
143
+ end
144
+
145
+ # Get the conflicting set modifications.
146
+ #
147
+ # @example Get the conflicting sets.
148
+ # modifiers.conflicting_sets
149
+ #
150
+ # @return [ Hash ] The conflicting set operations.
151
+ #
152
+ # @since 2.2.0
153
+ def conflicting_sets
154
+ conflicts["$set"] ||= {}
59
155
  end
60
156
 
61
157
  # Get the push operations that would have conflicted with the sets.
@@ -67,19 +163,43 @@ module Mongoid #:nodoc:
67
163
  #
68
164
  # @since 2.1.0
69
165
  def conflicts
70
- self[:other] ||= {}
166
+ self[:conflicts] ||= {}
71
167
  end
72
168
 
73
- # Get the list of stripped fields that are being updated.
169
+ # Get the names of the fields that need to be pulled.
74
170
  #
75
- # @example Get the fields.
76
- # modifiers.fields
171
+ # @example Get the pull fields.
172
+ # modifiers.pull_fields
77
173
  #
78
- # @return [ Array ] The stripped field names.
174
+ # @return [ Array<String> ] The pull fields.
175
+ #
176
+ # @since 2.2.0
177
+ def pull_fields
178
+ @pull_fields ||= []
179
+ end
180
+
181
+ # Get the names of the fields that need to be set.
182
+ #
183
+ # @example Get the set fields.
184
+ # modifiers.set_fields
185
+ #
186
+ # @return [ Array<String> ] The set fields.
187
+ #
188
+ # @since 2.2.0
189
+ def set_fields
190
+ @set_fields ||= []
191
+ end
192
+
193
+ # Get the $pullAll operations or intialize a new one.
194
+ #
195
+ # @example Get the $pullAll operations.
196
+ # modifiers.pulles
197
+ #
198
+ # @return [ Hash ] The $pullAll operations.
79
199
  #
80
200
  # @since 2.1.0
81
- def fields
82
- @fields ||= []
201
+ def pulls
202
+ self["$pullAll"] ||= {}
83
203
  end
84
204
 
85
205
  # Get the $pushAll operations or intialize a new one.
@@ -105,6 +225,18 @@ module Mongoid #:nodoc:
105
225
  def sets
106
226
  self["$set"] ||= {}
107
227
  end
228
+
229
+ # Get the $unset operations or initialize a new one.
230
+ #
231
+ # @example Get the $unset operations.
232
+ # modifiers.unsets
233
+ #
234
+ # @return [ Hash ] The $unset operations.
235
+ #
236
+ # @since 2.2.0
237
+ def unsets
238
+ self["$unset"] ||= {}
239
+ end
108
240
  end
109
241
  end
110
242
  end