模块: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 上为 $ 设立 。
139 140 141 |
# File 'lib/mongoid/atomic.rb', line 139 def atomic_delete_modifier atomic_paths.delete_modifier end |
#atomic_insert_modifier ⇒ String
获取文档的插入修饰符。 在根文档上将为 nil,在 embeds_one 上设立$,在 embeds_many 上设置 $push。
150 151 152 |
# File 'lib/mongoid/atomic.rb', line 150 def atomic_insert_modifier atomic_paths.insert_modifier end |
#atomic_path ⇒ string
以JSON表示法返回此Document的路径,用于通过MongoDB中的 $设立进行原子更新。
161 162 163 |
# File 'lib/mongoid/atomic.rb', line 161 def atomic_path atomic_paths.路径 end |
#atomic_paths ⇒对象
获取此文档的原子路径实用程序。
181 182 183 184 185 186 187 188 189 190 191 |
# File 'lib/mongoid/atomic.rb', line 181 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
返回此文档的位置操作符以进行修改。
171 172 173 |
# File 'lib/mongoid/atomic.rb', line 171 def atomic_position atomic_paths.Position end |
#atomic_pulls ⇒ Array<Hash>
获取所有需要拉取的属性。
199 200 201 202 203 204 205 206 207 208 209 210 |
# File 'lib/mongoid/atomic.rb', line 199 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 ⇒哈希
获取需要发生的所有推送属性。
218 219 220 |
# File 'lib/mongoid/atomic.rb', line 218 def atomic_pushes 可推送? ? { atomic_position => as_attributes } : {} end |
#atomic_sets ⇒哈希
获取需要设置的所有属性。
228 229 230 231 232 233 234 235 236 |
# File 'lib/mongoid/atomic.rb', line 228 def atomic_sets if 可更新? setter elsif 可设置? { atomic_path => as_attributes } else {} end end |
#atomic_unsets ⇒ Array<Hash>
获取所有需要取消设置的属性。
244 245 246 247 248 249 250 251 252 253 254 |
# File 'lib/mongoid/atomic.rb', line 244 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
119 120 121 122 123 124 125 126 127 128 |
# File 'lib/mongoid/atomic.rb', line 119 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 ⇒哈希
获取待处理的原子拉取的哈希值。
272 273 274 |
# File 'lib/mongoid/atomic.rb', line 272 def 延迟原子拉取 @delayed_atomic_pulls ||= {} end |
# Delayed_atomic_sets ⇒哈希
获取所有保存延迟的原子集。
262 263 264 |
# File 'lib/mongoid/atomic.rb', line 262 def Delayed_atomic_sets @delayed_atomic_sets ||= {} end |
# Delayed_atomic_unsets ⇒哈希
获取延迟的原子取消设置。
282 283 284 |
# File 'lib/mongoid/atomic.rb', line 282 def Delayed_atomic_unsets @delayed_atomic_unsets ||= {} end |
# flag_as_destroyed ⇒ string
将文档标记为已销毁并返回原子路径。
292 293 294 295 296 |
# File 'lib/mongoid/atomic.rb', line 292 def flag_as_destroyed self.销毁 = true self.flagged_for_destroy = false atomic_path end |
# flagged_destroys ⇒ Array<Proc>
获取带标记的销毁。
304 305 306 |
# File 'lib/mongoid/atomic.rb', line 304 def flagged_destroys @flag_destroys ||= [] end |
# process_flag_destroys ⇒数组
处理嵌套属性中所有待处理的标记销毁。
314 315 316 317 318 319 |
# File 'lib/mongoid/atomic.rb', line 314 def process_flag_destroys _assing do flagged_destroys.每(和:call) end flagged_destroys.清除 end |