模块: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

该模块包含支持对数据库进行原子操作的逻辑。

在命名空间下定义

模块: 路径 类: Modifiers

常量摘要折叠

UPDATES =
%i[
  atomic_array_pushes
  atomic_array_pulls
  atomic_array_add_to_sets
  atomic_pulls
  Delayed_atomic_sets
  延迟原子拉取
  Delayed_atomic_unsets
].冻结

实例方法摘要折叠

实例方法详细信息

# add_atomic_pull (document) ⇒对象

将文档添加为原子拉取。

例子:

添加原子拉取。

person.add_atomic_pull(address)

参数:

  • 文档 (文档)

    要提取的嵌入式文档。



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 >

为文档添加原子未设置。

例子:

添加原子未设置。

document.add_atomic_unset(doc)

参数:

  • 文档 (文档)

    子文档。

返回:

  • ( 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_setsHash

对于大量字段,这些是需要执行的唯一添加操作。

例子:

获取数组的唯一添加项。

person.atomic_array_add_to_sets

返回:

  • (哈希)

    大量add_to_sets。



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哈希

对于数组字段,这些是需要执行的拉取操作。

例子:

获取大量拉取。

person.atomic_array_pulls

返回:

  • (哈希)

    大量拉取。



82
83
84
# File 'lib/mongoid/atomic.rb', line 82

def atomic_array_pulls
  @atomic_array_pulls ||= {}
end

#atomic_array_pushes哈希

对于大量字段,需要进行这些推送。

例子:

获取大量推送。

person.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

返回要修改的属性的路径

例子:

获取属性的路径

address.atomic_attribute_name(:city)

返回:

  • ( string )

    数据库中文档属性的路径



62
63
64
# File 'lib/mongoid/atomic.rb', line 62

def atomic_attribute_name(名称)
  嵌入式? ? " #{ atomic_position } . #{ name } " : 名称
end

#atomic_delete_modifierString

获取文档的删除修饰符。 在根文档上将为 nil,在 embeds_one 上为 $unset,在 embeds_many 上为 $ 设立 。

例子:

获取移除操作符。

name.atomic_delete_modifier

返回:

  • ( string )

    拉取或取消设置操作。



139
140
141
# File 'lib/mongoid/atomic.rb', line 139

def atomic_delete_modifier
  atomic_paths.delete_modifier
end

#atomic_insert_modifierString

获取文档的插入修饰符。 在根文档上将为 nil,在 embeds_one 上设立$,在 embeds_many 上设置 $push。

例子:

获取插入操作。

name.atomic_insert_modifier

返回:

  • ( string )

    pull 或设立操作符。



150
151
152
# File 'lib/mongoid/atomic.rb', line 150

def atomic_insert_modifier
  atomic_paths.insert_modifier
end

#atomic_pathstring

以JSON表示法返回此Document的路径,用于通过MongoDB中的 $设立进行原子更新。

例子:

获取此文档的路径。

address.atomic_path

返回:

  • ( string )

    数据库中文档的路径。



161
162
163
# File 'lib/mongoid/atomic.rb', line 161

def atomic_path
  atomic_paths.路径
end

#atomic_paths对象

获取此文档的原子路径实用程序。

例子:

获取原子路径。

document.atomic_paths

返回:

  • ( Object )

    关联的路径。



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_positionstring

返回此文档的位置操作符以进行修改。

例子:

获取位置操作符。

address.atomic_position

返回:

  • ( string )

    带索引的位置操作符。



171
172
173
# File 'lib/mongoid/atomic.rb', line 171

def atomic_position
  atomic_paths.Position
end

#atomic_pullsArray<Hash>

获取所有需要拉取的属性。

例子:

获取拉力。

person.atomic_pulls

返回:

  • ( Array<Hash> )

    $pullAll 操作。



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哈希

获取需要发生的所有推送属性。

例子:

获取推送。

person.atomic_pushes

返回:

  • (哈希)

    $push 和 $each 操作。



218
219
220
# File 'lib/mongoid/atomic.rb', line 218

def atomic_pushes
  可推送? ? { atomic_position => as_attributes } : {}
end

#atomic_sets哈希

获取需要设置的所有属性。

例子:

获取集合。

person.atomic_sets

返回:

  • (哈希)

    $set 操作。



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_unsetsArray<Hash>

获取所有需要取消设置的属性。

例子:

获取未设置的值。

person.atomic_unsets

返回:

  • ( Array<Hash> )

    $unset 操作。



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

例子:

获取需要进行的更新。

person.atomic_updates(children)

返回:

  • (哈希)

    更新及其修饰符。



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哈希

获取待处理的原子拉取的哈希值。

例子:

获取原子拉取。

document.delayed_atomic_pulls

返回:

  • (哈希)

    名称/文档对。



272
273
274
# File 'lib/mongoid/atomic.rb', line 272

def 延迟原子拉取
  @delayed_atomic_pulls ||= {}
end

# Delayed_atomic_sets哈希

获取所有保存延迟的原子集。

例子:

获取延迟的原子集。

person.delayed_atomic_sets

返回:

  • (哈希)

    延迟的 $set。



262
263
264
# File 'lib/mongoid/atomic.rb', line 262

def Delayed_atomic_sets
  @delayed_atomic_sets ||= {}
end

# Delayed_atomic_unsets哈希

获取延迟的原子取消设置。

例子:

获取延迟的原子取消设置。

document.delayed_atomic_unsets

返回:

  • (哈希)

    原子未设置



282
283
284
# File 'lib/mongoid/atomic.rb', line 282

def Delayed_atomic_unsets
  @delayed_atomic_unsets ||= {}
end

# flag_as_destroyedstring

将文档标记为已销毁并返回原子路径。

例子:

标记已销毁并返回路径。

document.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_destroysArray<Proc>

获取带标记的销毁。

例子:

获取带标记的销毁。

document.flagged_destroys

返回:

  • ( Array<Proc> )

    带标记的销毁。



304
305
306
# File 'lib/mongoid/atomic.rb', line 304

def flagged_destroys
  @flag_destroys ||= []
end

# process_flag_destroys数组

处理嵌套属性中所有待处理的标记销毁。

例子:

处理所有待处理的标记销毁。

document.process_flagged_destroys

返回:

  • ( Array )

    已清除的大量。



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