Módulo: Mongoid::Atomic

Ampliado por:
ActiveSupport::Concern
Incluido en:
Composable, Contextual::Mongo
Definido en:
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

Este módulo contiene la lógica para admitir operaciones atómicas contra la base de datos.

Definido bajo Namespace

Modules: Rutas clase: Modifiers

Resumen de constantes colapsar

UPDATES =
%i[
  atomic_array_pushes
  atomic_array_pulls
  atomic_array_add_to_sets
  Extracciones atómicas
  delayed_atomic_sets
  delayed_atomic_pulls
  delayed_atomic_unsets
].freeze

Resumen del método de instancia colapsar

Detalles del método de instancia

#add_atomic_pull(documento) ⇒ objeto

Agregar el documento como una extracción atómica.

Ejemplos:

Agrega el pull atómico.

person.add_atomic_pull(address)

Parámetros:

  • Documento (documento)

    O documento incrustado para ser removido.



34
35
36
37
38
39
# Archivo 'lib/mongoid/atomic.rb', línea 34

def add_atomic_pull(Documento)
  Documento.marcado_para_destruir = true
  llave = Documento.association_name.to_s
  delayed_atomic_pulls[llave] ||= []
  delayed_atomic_pulls[llave] << Documento
end

#add_atomic_unset(document) ⇒ Array<Document>

Añadir un desajuste atómico para el documento.

Ejemplos:

Agrega un unset atómico.

document.add_atomic_unset(doc)

Parámetros:

  • Documento (documento)

    El documento secundario.

Devuelve:

  • (Array<documento>)

    Los niños y niñas.



49
50
51
52
53
54
# Archivo 'lib/mongoid/atomic.rb', línea 49

def add_atomic_unset(Documento)
  Documento.marcado_para_destruir = true
  llave = Documento.association_name.to_s
  delayed_atomic_unsets[llave] ||= []
  delayed_atomic_unsets[llave] << Documento
end

#atomic_array_add_to_setsHash

Para los campos de arreglos, estas son las adiciones únicas que deben ocurrir.

Ejemplos:

Obtén las adiciones únicas del arreglo.

person.atomic_array_add_to_sets

Devuelve:

  • (encriptada)

    El arreglo add_to_sets.



92
93
94
# Archivo 'lib/mongoid/atomic.rb', línea 92

def atomic_array_add_to_sets
  @atomic_array_add_to_sets ||= {}
end

#atomic_array_pullsHash

Para los campos de arreglo, estos son los retiros que deben realizarse.

Ejemplos:

Obtén las extracciones de arreglos.

person.atomic_array_pulls

Devuelve:

  • (encriptada)

    El arreglo tira.



82
83
84
# Archivo 'lib/mongoid/atomic.rb', línea 82

def atomic_array_pulls
  @atomic_array_pulls ||= {}
end

#atomic_array_pushesHash

Para campos de arreglo, estos son los pushes que deben ocurrir.

Ejemplos:

Obtén los insertos en el arreglo.

person.atomic_array_pushes

Devuelve:

  • (encriptada)

    El arreglo empuja.



72
73
74
# Archivo 'lib/mongoid/atomic.rb', línea 72

def atomic_array_pushes
  @atomic_array_pushes ||= {}
end

#atomic_attribute_name(nombre) ⇒ String

Devuelve la ruta del atributo para su modificación

Ejemplos:

Obtener la ruta del atributo

address.atomic_attribute_name(:city)

Devuelve:

  • (string)

    La ruta al atributo del documento en la base de datos



62
63
64
# Archivo 'lib/mongoid/atomic.rb', línea 62

def atomic_attribute_name(Nombre)
  ¿Incorporado? ? "#{atomic_position}.#{name}" : Nombre
end

#atomic_delete_modifierString

Obtenga el modificador de eliminación para el documento. Será nulo en los documentos raíz, $unset en embeds_one, $set en embeds_many.

Ejemplos:

Obtener el operador de eliminación.

name.atomic_delete_modifier

Devuelve:

  • (string)

    La operación de extracción o anulación.



136
137
138
# Archivo 'lib/mongoid/atomic.rb', línea 136

def atomic_delete_modifier
  atomic_paths.delete_modifier
end

#atomic_insert_modifierString

Obtén el modificador de inserción para el documento. Será nulo en documentos raíz, $set en embeds_one, $push en embeds_many.

Ejemplos:

Obtén la operación de inserción.

name.atomic_insert_modifier

Devuelve:

  • (string)

    El operador pull o set.



147
148
149
# Archivo 'lib/mongoid/atomic.rb', línea 147

def atomic_insert_modifier
  atomic_paths.insert_modifier
end

#atomic_pathString

Devuelve la ruta a este Document en notación JSON, que se utiliza para actualizaciones atómicas mediante $set en MongoDB.

Ejemplos:

Obtenga la ruta de este documento.

address.atomic_path

Devuelve:

  • (string)

    La ruta al documento en la base de datos.



158
159
160
# Archivo 'lib/mongoid/atomic.rb', línea 158

def atomic_path
  atomic_paths.ruta
end

#atomic_pathsObjeto

Obtén la utilidad de rutas atómicas para este documento.

Ejemplos:

Obtén las rutas atómicas.

document.atomic_paths

Devuelve:

  • (objeto)

    La ruta asociada.



178
179
180
181
182
183
184
185
186
187
188
# Archivo 'lib/mongoid/atomic.rb', línea 178

def atomic_paths
  return @atomic_paths si @atomic_paths

  paths = si _association
            _association.ruta(sí mismo)
          else
            Atómico::Rutas::Root (raíz).Nuevo(sí mismo)
          end

  paths.tocar { @atomic_paths = paths a menos que nuevo_registro? }
end

#atomic_positionString

Devuelve el operador posicional de este documento para su modificación.

Ejemplos:

Obtiene el operador posicional.

address.atomic_position

Devuelve:

  • (string)

    El operador posicional con índices.



168
169
170
# Archivo 'lib/mongoid/atomic.rb', línea 168

def posición_atómica
  atomic_paths.posición
end

#atomic_pullsArray<Hash>

Obtener todos los atributos que deben extraerse.

Ejemplos:

Obtén las extracciones.

person.atomic_pulls

Devuelve:

  • (arreglo<Hash>)

    Las operaciones $pullAll.



196
197
198
199
200
201
202
203
204
205
206
207
# Archivo 'lib/mongoid/atomic.rb', línea 196

def Extracciones atómicas
  extracciones = {}
  delayed_atomic_pulls.each_pair hacer |_, docs|
    ruta = nulo
    identificadores = docs.map hacer |doc|
      ruta ||= doc.marcar_como_destruido
      doc._id
    end
    extracciones[ruta] = { '_id' => { '$in' => identificadores } } y  ruta = nulo
  end
  extracciones
end

#atomic_pushesHash

Obtén todos los atributos push que se deben producir.

Ejemplos:

Obtén los pushes.

person.atomic_pushes

Devuelve:

  • (encriptada)

    Las operaciones $push y $each.



215
216
217
# Archivo 'lib/mongoid/atomic.rb', línea 215

def impulsos_atómicos
  pushable? ? { posición_atómica => as_attributes } : {}
end

#atomic_setsHash

Obtén todos los atributos que deben establecerse.

Ejemplos:

Obtén los sets.

person.atomic_sets

Devuelve:

  • (encriptada)

    Las operaciones $set.



225
226
227
228
229
230
231
232
233
# Archivo 'lib/mongoid/atomic.rb', línea 225

def conjuntos atómicos
  si ¿actualizable?
    asignadores
  elsif ¿configurable?
    { atomic_path => as_attributes }
  else
    {}
  end
end

#atomic_unsetsarreglo<Hash>

Obtenga todos los atributos que necesitan ser desactivados.

Ejemplos:

Obtén los unsets.

person.atomic_unsets

Devuelve:

  • (arreglo<Hash>)

    Las operaciones unset.



241
242
243
244
245
246
247
248
249
250
251
# Archivo 'lib/mongoid/atomic.rb', línea 241

def atomic_unsets
  No establecidos = []
  delayed_atomic_unsets.each_pair hacer |Nombre, docs|
    ruta = nulo
    docs.cada hacer |doc|
      ruta ||= doc.marcar_como_destruido
    end
    No establecidos.push(ruta || Nombre)
  end
  No establecidos
end

#atomic_updates(_use_indexes = false) ⇒ Hash También conocido como: _updates

Nota:

MongoDB no permite que se realicen «modificaciones conflictivas» en una única operación. Las modificaciones en conflicto se detectan mediante la función 'haveConflictingMod' en MongoDB. El análisis del código sugiere que dos modificaciones (como un $set y un $push con $each) entran en conflicto si:

(1) the key paths being modified are equal.
(2) one key path is a prefix of the other.

Por lo tanto, un $set de 'addresses.0.street' entrará en conflicto con un $push y $each a 'addresses', y necesitaremos dividir nuestra actualización en dos partes. Sin embargo, no intentamos igualar exactamente la lógica de MongoDB. En su lugar, asumimos que dos actualizaciones entran en conflicto si el primer componente de las dos rutas clave coincide.

Obtén todas las actualizaciones atómicas que deben suceder para la Document actual. Esto incluye todos los cambios que deben ocurrir en toda la jerarquía que existe por debajo de donde se realizó la llamada de guardado.

rubocop:disable Style/OptionalBooleanParameter

Devuelve:

  • (encriptada)

    Las actualizaciones y sus modificadores.



116
117
118
119
120
121
122
123
124
125
# Archivo 'lib/mongoid/atomic.rb', línea 116

def atomic_updates(_use_indexes = false)
  process_flagged_destroys
  mods = Modifiers.Nuevo
  generate_atomic_updates(mods, sí mismo)
  _descendants.cada hacer |niño|
    niño.process_flagged_destroys
    generate_atomic_updates(mods, niño)
  end
  mods
end

#delayed_atomic_pullsHash

Obten un hash de extracciones atómicas que están pendientes.

Ejemplos:

Consigue los pulls atómicos.

document.delayed_atomic_pulls

Devuelve:

  • (encriptada)

    parejas nombre/documento.



269
270
271
# Archivo 'lib/mongoid/atomic.rb', línea 269

def delayed_atomic_pulls
  @pulls_atómicos_retrasados ||= {}
end

#delayed_atomic_setsHash

Obtén todos los conjuntos atómicos cuyos guardados se hayan retrasado.

Ejemplos:

Obtén los conjuntos atómicos retrasados.

person.delayed_atomic_sets

Devuelve:

  • (encriptada)

    Los conjuntos retrasados.



259
260
261
# Archivo 'lib/mongoid/atomic.rb', línea 259

def delayed_atomic_sets
  @delayed_atomic_sets ||= {}
end

#delayed_atomic_unsetsHash

Obtén los desestablecimientos atómicos retrasados.

Ejemplos:

Obtén los desestablecimientos atómicos retrasados.

document.delayed_atomic_unsets

Devuelve:

  • (encriptada)

    Las anulaciones atómicas



279
280
281
# Archivo 'lib/mongoid/atomic.rb', línea 279

def delayed_atomic_unsets
  @delayed_atomic_unsets ||= {}
end

#flag_as_destroyedString

Marca el documento como destruido y devuelve la ruta atómica.

Ejemplos:

Indicador destruido y ruta de retorno.

document.flag_as_destroyed

Devuelve:

  • (string)

    El camino atómico.



289
290
291
292
293
# Archivo 'lib/mongoid/atomic.rb', línea 289

def marcar_como_destruido
  sí mismo.destruido = true
  sí mismo.marcado_para_destruir = false
  atomic_path
end

#flagged_destroysArray<Proc>

Obtenga las destrucciones marcadas.

Ejemplos:

Obtén el objeto destroy marcado.

document.flagged_destroys

Devuelve:

  • (arreglo<Proc>)

    Los marcados destruyen.



301
302
303
# Archivo 'lib/mongoid/atomic.rb', línea 301

def flagged_destroys
  @flagged_destroys ||= []
end

#process_flagged_destroysarreglo

Procesar todas las eliminaciones marcadas pendientes de los atributos anidados.

Ejemplos:

Procesa todas las destrucciones pendientes marcadas.

document.process_flagged_destroys

Devuelve:

  • (arreglo)

    El arreglo borrado.



311
312
313
314
315
316
# Archivo 'lib/mongoid/atomic.rb', línea 311

def process_flagged_destroys
  asignando hacer
    flagged_destroys.cada(&llamar)
  end
  flagged_destroys.borrar
end