Módulo: Mongoid::Atomic

Estendido por:
ActiveSupport::Concern
Incluído em:
Composto, Contexto::Mongo
Definido em:
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

Visão geral

Este módulo contém a lógica para suportar operações atômicas no banco de banco de dados.

Definido sob namespace

Módulos: Caminhos Classes: Modifiers

Colapsode resumo constante

UPDATES =
%i[
  atomic_array_pushes
  atomic_array_pulls
  atomic_array_add_to_sets
  atomic_pulls
  delay_atomic_sets
  delay_atomic_pulls
  delay_atomic_unsets
].congelar

Recolhimento do Resumo do método de instância

Detalhes do método de instância

#add_atomic_pull(document) ➤ Objeto

Adicione o documento como um pull atômico.

Exemplos:

Adicione a força atômica.

person.add_atomic_pull(address)

Parâmetros:

  • documento (Documento)

    O documento incorporado a ser extraído.



34
35
36
37
38
39
# Arquivo 'lib/mongoid/atomic.rb', linha 34

def add_atomic_pull(documento)
  documento.sinalizado_for_destroy = true
  chave = documento.association_name.to_s
  delay_atomic_pulls[chave] ||= []
  delay_atomic_pulls[chave] << documento
end

#add_atomic_unset(document) ➤ Array<Document>

Adicione uma desconfiguração atômica para o documento.

Exemplos:

Adicione um desconjunto atômico.

document.add_atomic_unset(doc)

Parâmetros:

  • documento (Documento)

    O documento filho.

Retorna:



49
50
51
52
53
54
# Arquivo 'lib/mongoid/atomic.rb', linha 49

def add_atomic_unset(documento)
  documento.sinalizado_for_destroy = true
  chave = documento.association_name.to_s
  delay_atomic_unsets[chave] ||= []
  delay_atomic_unsets[chave] << documento
end

#atomic_array_add_to_setsHash

Para campos de array, essas são as adições exclusivas que precisam acontecer.

Exemplos:

Obtenha os anúncios exclusivos da array.

person.atomic_array_add_to_sets

Retorna:

  • (Hash)

    A matriz add_to_sets.



92
93
94
# Arquivo 'lib/mongoid/atomic.rb', linha 92

def atomic_array_add_to_sets
  @atomic_array_add_to_sets ||= {}
end

#atomic_array_pulls ➤ Hash

Para campos de array, essas são as puxações que precisam acontecer.

Exemplos:

Obtenha os pulls da array.

person.atomic_array_pulls

Retorna:

  • (Hash)

    A array puxa.



82
83
84
# Arquivo 'lib/mongoid/atomic.rb', linha 82

def atomic_array_pulls
  @atomic_array_pulls ||= {}
end

#atomic_array_pushes ➤ Hash

Para campos de array, esses são os pushes que precisam acontecer.

Exemplos:

Obtenha os pushs da array.

person.atomic_array_pushes

Retorna:

  • (Hash)

    A array empurra.



72
73
74
# Arquivo 'lib/mongoid/atomic.rb', linha 72

def atomic_array_pushes
  @atomic_array_pushes ||= {}
end

#atomic_attribute_name(name) ➤ string

Retorna o caminho do atributo para modificação

Exemplos:

Obter caminho do atributo

address.atomic_attribute_name(:city)

Retorna:

  • (string)

    O caminho para o atributo do documento no banco de banco de dados



62
63
64
# Arquivo 'lib/mongoid/atomic.rb', linha 62

def atomic_attribute_name(name)
  incorporado? ? "#{atomic_position}.#{name}" : name
end

#atomic_delete_modifierString

Obtenha o modificador de remoção do documento. será nulo em documentos raiz, $unset em embeds_one, $set em embeds_many.

Exemplos:

Obtenha o operador de remoção.

name.atomic_delete_modifier

Retorna:

  • (string)

    A operação de puxar ou desconfigurar.



139
140
141
# Arquivo 'lib/mongoid/atomic.rb', linha 139

def atomic_delete_modifier
  atomic_paths.delete_modifier
end

#atomic_insert_modifierString

Obtenha o modificador de inserção para o documento. será nulo em documentos raiz, $set em embeds_one, $push em embeds_many.

Exemplos:

Obtenha a operação de inserção.

name.atomic_insert_modifier

Retorna:

  • (string)

    O operador pull ou set.



150
151
152
# Arquivo 'lib/mongoid/atomic.rb', linha 150

def atomic_insert_modifier
  atomic_paths.insert_modifier
end

#atomic_path ➤ string

Retorne o caminho para este Document na notação JSON, utilizado para atualizações atômicas via $set no MongoDB.

Exemplos:

Obtenha o caminho para este documento.

address.atomic_path

Retorna:

  • (string)

    O caminho para o documento no banco de dados.



161
162
163
# Arquivo 'lib/mongoid/atomic.rb', linha 161

def atomic_path
  atomic_paths.caminho
end

#atomic_paths ➤ Objeto

Obtenha o utilitário de caminhos atômicos para este documento.

Exemplos:

Obtenha os caminhos atômicos.

document.atomic_paths

Retorna:

  • (Objeto)

    O caminho associado.



181
182
183
184
185
186
187
188
189
190
191
# Arquivo 'lib/mongoid/atomic.rb', linha 181

def atomic_paths
  Método @atomic_paths se @atomic_paths

  caminhos = se _association
            _association.caminho(auto)
          mais
            Atômico::Caminhos::Raiz.Novo(auto)
          end

  caminhos.toque { @atomic_paths = caminhos a menos que new_record? }
end

#atomic_position ➤ string

Retorna o operador posicional deste documento para modificação.

Exemplos:

Obtenha o operador posicional.

address.atomic_position

Retorna:

  • (string)

    O operador posicional com índices.



171
172
173
# Arquivo 'lib/mongoid/atomic.rb', linha 171

def atomic_position
  atomic_paths.Posição
end

#atomic_pulls ➤ Array<Hash>

Obtenha todos os atributos que precisam ser extraídos.

Exemplos:

Obtenha os pulls.

person.atomic_pulls

Retorna:

  • (Array<Hash>)

    As operações $pullAll.



199
200
201
202
203
204
205
206
207
208
209
210
# Arquivo 'lib/mongoid/atomic.rb', linha 199

def atomic_pulls
  puxa = {}
  delay_atomic_pulls.cada_pair fazer |_, Docs|
    caminho = nada
    ids = Docs.map fazer |doc|
      caminho ||= doc.flag_as_destroyed
      doc._id
    end
    puxa[caminho] = { '_id' => { '$in' => ids } } e a caminho = nada
  end
  puxa
end

#atomic_pushes ➤ Hash

Obtenha todos os atributos de push que precisam ocorrer.

Exemplos:

Receba os pushes.

person.atomic_pushes

Retorna:

  • (Hash)

    As operações $push e $each.



218
219
220
# Arquivo 'lib/mongoid/atomic.rb', linha 218

def atomic_pushes
  pushable? ? { atomic_position => as_attributes } : {}
end

#atomic_sets ➤ Hash

Obtenha todos os atributos que precisam ser definidos.

Exemplos:

Obtenha os conjuntos.

person.atomic_sets

Retorna:

  • (Hash)

    As operações $set.



228
229
230
231
232
233
234
235
236
# Arquivo 'lib/mongoid/atomic.rb', linha 228

def atomic_sets
  se atualizável?
    setters
  elsif configurável?
    { atomic_path => as_attributes }
  mais
    {}
  end
end

#atomic_unsets ➤ Array<Hash>

Obtenha todos os atributos que precisam ser desconfigurados.

Exemplos:

Obtenha os desconfiguramentos.

person.atomic_unsets

Retorna:

  • (Array<Hash>)

    As operações $unset.



244
245
246
247
248
249
250
251
252
253
254
# Arquivo 'lib/mongoid/atomic.rb', linha 244

def atomic_unsets
  Desconfigura = []
  delay_atomic_unsets.cada_pair fazer |name, Docs|
    caminho = nada
    Docs.cada fazer |doc|
      caminho ||= doc.flag_as_destroyed
    end
    Desconfigura.push(caminho || name)
  end
  Desconfigura
end

#atomic_updates(_use_indexes = false) ➤ Hash Também conhecido como: _updates

Observação:

O MongoDB não permite que “modificações conflitantes” sejam realizadas em uma única operação. Modificações conflitantes são detectadas pela função 'keyConflictingMod' no MongoDB. O exame do código sugere que duas modificações (a $set e a $push com $each, por exemplo) entram em conflito se:

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

Então, um $set de 'endereços'.0.street' entrará em conflito com um $push e $each para 'addresses', e precisaremos divisão nossa atualização em duas partes. No entanto, não tentamos corresponder exatamente à lógica do MongoDB. Em vez disso, assumimos que duas atualizações entrarão em conflito se o primeiro componente dos dois caminhos principais corresponder.

Obtenha todas as atualizações atômicas que precisam acontecer para o Document atual. Isso inclui todas as alterações que precisam ocorrer em toda a hierarquia existente abaixo de onde a chamada salva foi feita.

rubocop:disable estilo/OptionalBooleanParameter

Exemplos:

Obtenha as atualizações que precisam ocorrer.

person.atomic_updates(children)

Retorna:

  • (Hash)

    As atualizações e seus modificadores.



119
120
121
122
123
124
125
126
127
128
# Arquivo 'lib/mongoid/atomic.rb', linha 119

def atomic_updates(_use_indexes = false)
  process_flagens_destroys
  mods = Modifiers.Novo
  generate_atomic_updates(mods, auto)
  _descendentes.cada fazer |criança|
    criança.process_flagens_destroys
    generate_atomic_updates(mods, criança)
  end
  mods
end

#atrasou_atomic_pulls ➤ Hash

Obtenha um hash de pulls atômicos pendentes.

Exemplos:

Obtenha os pulls atômicos.

document.delayed_atomic_pulls

Retorna:

  • (Hash)

    pares de nome/documento.



272
273
274
# Arquivo 'lib/mongoid/atomic.rb', linha 272

def delay_atomic_pulls
  @delayed_atomic_pulls ||= {}
end

#atrasou_atomic_sets ➤ Hash

Obtenha todos os conjuntos atômicos que tiveram seus salvamentos atrasados.

Exemplos:

Obtenha os conjuntos atômicos atrasados.

person.delayed_atomic_sets

Retorna:

  • (Hash)

    Os $sets atrasados.



262
263
264
# Arquivo 'lib/mongoid/atomic.rb', linha 262

def delay_atomic_sets
  @delayed_atomic_sets ||= {}
end

#delay_atomic_unsets ➤ Hash

Obtenha as desconfigurações atômicas atrasadas.

Exemplos:

Obtenha as desconfigurações atômicas atrasadas.

document.delayed_atomic_unsets

Retorna:

  • (Hash)

    Os desconjuntos atômicos



282
283
284
# Arquivo 'lib/mongoid/atomic.rb', linha 282

def delay_atomic_unsets
  @delayed_atomic_unsets ||= {}
end

#flag_as_destroyed ➤ string

Sinalize o documento como destruído e retorne o caminho atômico.

Exemplos:

Sinalizador destruído e caminho de retorno.

document.flag_as_destroyed

Retorna:

  • (string)

    O caminho atômico.



292
293
294
295
296
# Arquivo 'lib/mongoid/atomic.rb', linha 292

def flag_as_destroyed
  auto.destruído = true
  auto.sinalizado_for_destroy = false
  atomic_path
end

#sinalizado_destroys ➤ Array<Proc>

Obtenha as destruições sinalizadas.

Exemplos:

Obtenha a destruição sinalizada.

document.flagged_destroys

Retorna:

  • (Array<Proc>)

    O sinalizado destrói.



304
305
306
# Arquivo 'lib/mongoid/atomic.rb', linha 304

def sinalizados_destroys
  @flog_destroys ||= []
end

#process_flranged_destroys toy Array

Processe todas as destruições sinalizadas pendentes de atributos aninhados.

Exemplos:

Processe todas as destruições sinalizadas pendentes.

document.process_flagged_destroys

Retorna:

  • (Array)

    A array limpa.



314
315
316
317
318
319
# Arquivo 'lib/mongoid/atomic.rb', linha 314

def process_flagens_destroys
  _assigning fazer
    sinalizados_destroys.cada(&:call)
  end
  sinalizados_destroys.Limpar
end