模块:Mongoid::Atomic
- 扩展方式:
- ActiveSupport::Concern
- 包含在:
- Composable , Contextual::Mongo
- 定义于:
- lib/mongoid/atomic.rb ,
lib/mongoid/atomic/modifiers.rb,
lib/mongoid/atomic/paths/root.rb,
lib/mongoid/atomic/paths/embedded.rb,
lib/mongoid/atomic/paths/embedded/one.rb,
lib/mongoid/atomic/paths/embedded/many.rb
Overview
该模块包含支持对数据库进行原子操作的逻辑。
在命名空间下定义
常量摘要折叠
- UPDATES =
%i[ atomic_array_pushes atomic_array_pulls atomic_array_add_to_sets atomic_pulls Delayed_atomic_sets 延迟原子拉取 Delayed_atomic_unsets ].冻结
实例方法摘要折叠
-
# add_atomic_pull (文档) ⇒ 对象
将文档添加为原子拉取。
-
# add_atomic_unset (文档) ⇒ Array<Document>
为文档添加原子未设置。
-
#atomic_array_add_to_sets ⇒ Hash
对于大量字段,这些是需要执行的唯一添加操作。
-
#atomic_array_pulls ⇒ 哈希
对于数组字段,这些是需要执行的拉取操作。
-
#atomic_array_pushes ⇒ 哈希
对于大量字段,需要进行这些推送。
-
#atomic_attribute_name (name) ⇒ string
返回要修改的属性的路径。
-
#atomic_delete_modifier ⇒ String
获取文档的删除修饰符。
-
#atomic_insert_modifier ⇒ String
获取文档的插入修饰符。
-
#atomic_path ⇒ string
以JSON表示法返回此
Document的路径,用于通过MongoDB中的 $设立进行原子更新。 -
#atomic_paths ⇒ 对象
获取此文档的原子路径实用程序。
-
#atomic_position ⇒ string
返回此文档的位置操作符以进行修改。
-
#atomic_pulls ⇒ Array<Hash>
获取所有需要拉取的属性。
-
#atomic_pushes ⇒ 哈希
获取需要发生的所有推送属性。
-
#atomic_sets ⇒ 哈希
获取需要设置的所有属性。
-
#atomic_unsets ⇒ Array<Hash>
获取所有需要取消设置的属性。
-
#atomic_updates (_use_indexes = false) ⇒ 哈希(也:#_updates)
获取当前
Document需要发生的所有原子更新。 -
# Delayed_atomic_pulls ⇒ 哈希
获取待处理的原子拉取的哈希值。
-
# Delayed_atomic_sets ⇒ 哈希
获取所有保存延迟的原子集。
-
# Delayed_atomic_unsets ⇒ 哈希
获取延迟的原子取消设置。
-
# flag_as_destroyed ⇒ string
将文档标记为已销毁并返回原子路径。
-
# flagged_destroys ⇒ Array<Proc>
获取带标记的销毁。
-
# process_flag_destroys ⇒ 数组
处理嵌套属性中所有待处理的标记销毁。
实例方法详细信息
# add_atomic_pull (document) ⇒对象
将文档添加为原子拉取。
34 35 36 37 38 39 |
# File 'lib/mongoid/atomic.rb', line 34 def add_atomic_pull(文档) 文档.flagged_for_destroy = true key = 文档.Association_name.to_s 延迟原子拉取[key] ||= [] 延迟原子拉取[key] << 文档 end |
# add_atomic_unset (document) ⇒ Array< Document >
为文档添加原子未设置。
49 50 51 52 53 54 |
# File 'lib/mongoid/atomic.rb', line 49 def add_atomic_unset(文档) 文档.flagged_for_destroy = true key = 文档.Association_name.to_s Delayed_atomic_unsets[key] ||= [] Delayed_atomic_unsets[key] << 文档 end |
#atomic_array_add_to_sets ⇒ Hash
对于大量字段,这些是需要执行的唯一添加操作。
92 93 94 |
# File 'lib/mongoid/atomic.rb', line 92 def atomic_array_add_to_sets @atomic_array_add_to_sets ||= {} end |
#atomic_array_pulls ⇒哈希
对于数组字段,这些是需要执行的拉取操作。
82 83 84 |
# File 'lib/mongoid/atomic.rb', line 82 def atomic_array_pulls @atomic_array_pulls ||= {} end |
#atomic_array_pushes ⇒哈希
对于大量字段,需要进行这些推送。
72 73 74 |
# File 'lib/mongoid/atomic.rb', line 72 def atomic_array_pushes @atomic_array_pushes ||= {} end |
#atomic_attribute_name (name) ⇒ string
返回要修改的属性的路径
62 63 64 |
# File 'lib/mongoid/atomic.rb', line 62 def atomic_attribute_name(名称) ? " #{ atomic_position } . #{ name } " : 名称 end |
#atomic_delete_modifier ⇒ String
获取文档的删除修饰符。 在根文档上将为 nil,在 embeds_one 上为 $unset,在 embeds_many 上为 $ 设立 。
136 137 138 |
# File 'lib/mongoid/atomic.rb', line 136 def atomic_delete_modifier atomic_paths.delete_modifier end |
#atomic_insert_modifier ⇒ String
获取文档的插入修饰符。 在根文档上将为 nil,在 embeds_one 上设立$,在 embeds_many 上设置 $push。
147 148 149 |
# File 'lib/mongoid/atomic.rb', line 147 def atomic_insert_modifier atomic_paths.insert_modifier end |
#atomic_path ⇒ string
以JSON表示法返回此Document的路径,用于通过MongoDB中的 $设立进行原子更新。
158 159 160 |
# File 'lib/mongoid/atomic.rb', line 158 def atomic_path atomic_paths.路径 end |
#atomic_paths ⇒对象
获取此文档的原子路径实用程序。
178 179 180 181 182 183 184 185 186 187 188 |
# File 'lib/mongoid/atomic.rb', line 178 def atomic_paths return @atomic_paths if @atomic_paths paths = if _association _association.路径(self) else 原子性::路径::根.new(self) end paths.点击 { @atomic_paths = paths 除非 new_record? } end |
#atomic_position ⇒ string
返回此文档的位置操作符以进行修改。
168 169 170 |
# File 'lib/mongoid/atomic.rb', line 168 def atomic_position atomic_paths.Position end |
#atomic_pulls ⇒ Array<Hash>
获取所有需要拉取的属性。
196 197 198 199 200 201 202 203 204 205 206 207 |
# File 'lib/mongoid/atomic.rb', line 196 def atomic_pulls pull = {} 延迟原子拉取.each_pair do |_, docs| 路径 = nil id = docs.map do |doc| 路径 ||= doc.flag_as_destroyed doc._id end pull[路径] = { '_id' => { ' $in ' => id } } 和 路径 = nil end pull end |
#atomic_pushes ⇒哈希
获取需要发生的所有推送属性。
215 216 217 |
# File 'lib/mongoid/atomic.rb', line 215 def atomic_pushes 可推送? ? { atomic_position => as_attributes } : {} end |
#atomic_sets ⇒哈希
获取需要设置的所有属性。
225 226 227 228 229 230 231 232 233 |
# File 'lib/mongoid/atomic.rb', line 225 def atomic_sets if 可更新? setter elsif 可设置? { atomic_path => as_attributes } else {} end end |
#atomic_unsets ⇒ Array<Hash>
获取所有需要取消设置的属性。
241 242 243 244 245 246 247 248 249 250 251 |
# File 'lib/mongoid/atomic.rb', line 241 def atomic_unsets 取消设置 = [] Delayed_atomic_unsets.each_pair do |名称, docs| 路径 = nil docs.每 do |doc| 路径 ||= doc.flag_as_destroyed end 取消设置.推动(路径 || 名称) end 取消设置 end |
#atomic_updates (_use_indexes = false) ⇒哈希也称为: _updates
MongoDB不允许在单个操作中执行“冲突的修改”。冲突的修改由MongoDB中的“haveConflictingMod”函数检测到。对代码的检查表明,如果出现示例,则两个修改(例如 $ 设立和带有 $each 的 $push)发生冲突:
(1) the key paths being modified are equal.
(2) one key path is a prefix of the other.
因此,“addresses.0.street”的 $ 设立会与“addresses”的 $push 和 $each 发生冲突,我们需要将更新分割两部分。但是,我们并不尝试完全匹配 MongoDB 的逻辑。相反,如果两个键路径的第一个组件匹配,我们假设两个更新发生冲突。
获取当前Document需要发生的所有原子更新。 这包括在调用保存位置下方的整个层次结构中需要发生的所有更改。
rubocop:disable Style/OptionalBooleanParameter
116 117 118 119 120 121 122 123 124 125 |
# File 'lib/mongoid/atomic.rb', line 116 def atomic_updates(_use_indexes = false) process_flag_destroys mods = Modifiers.new generate_atomic_updates(mods, self) _descendants.每 do |子项| 子项.process_flag_destroys generate_atomic_updates(mods, 子项) end mods end |
# Delayed_atomic_pulls ⇒哈希
获取待处理的原子拉取的哈希值。
269 270 271 |
# File 'lib/mongoid/atomic.rb', line 269 def 延迟原子拉取 @delayed_atomic_pulls ||= {} end |
# Delayed_atomic_sets ⇒哈希
获取所有保存延迟的原子集。
259 260 261 |
# File 'lib/mongoid/atomic.rb', line 259 def Delayed_atomic_sets @delayed_atomic_sets ||= {} end |
# Delayed_atomic_unsets ⇒哈希
获取延迟的原子取消设置。
279 280 281 |
# File 'lib/mongoid/atomic.rb', line 279 def Delayed_atomic_unsets @delayed_atomic_unsets ||= {} end |
# flag_as_destroyed ⇒ string
将文档标记为已销毁并返回原子路径。
289 290 291 292 293 |
# File 'lib/mongoid/atomic.rb', line 289 def flag_as_destroyed self.销毁 = true self.flagged_for_destroy = false atomic_path end |
# flagged_destroys ⇒ Array<Proc>
获取带标记的销毁。
301 302 303 |
# File 'lib/mongoid/atomic.rb', line 301 def flagged_destroys @flag_destroys ||= [] end |
# process_flag_destroys ⇒数组
处理嵌套属性中所有待处理的标记销毁。
311 312 313 314 315 316 |
# File 'lib/mongoid/atomic.rb', line 311 def process_flag_destroys _assing do flagged_destroys.每(和:call) end flagged_destroys.清除 end |