Menu Docs
Página inicial do Docs
/ / /
Driver Ruby MongoDB
/

Operações CRUD

Nesta página

  • Notação de par de valores-chave
  • Criar documentos
  • Cache de consulta
  • Leitura
  • Atualizando
  • Excluindo
  • Escreva preocupação
  • Nomes de campo com pontos/pontos finais (.) e cifrões ($)
  • Uma observação sobre o tipo de símbolo BSON

As operações CRUD são aquelas que lidam com a criação, leitura, atualização e exclusão de documentos.

Os pares de valores-chave aparecem em muitos contextos diferentes no driver Ruby do MongoDB, e há algumas particularidades de sintaxe relacionadas a como eles podem ser notados que dependem da versão do Ruby que você está usando.

Ao construir um documento, a seguinte sintaxe é aceitável e correta para Ruby versão 1.9 e posterior:

document = { name: "Harriet", age: 36 }

Se você estiver usando o Ruby versão 2.2 ou superior, poderá opcionalmente colocar suas chaves entre aspas.

document = { "name": "Harriet", "age": 36 }

Se você precisar usar qualquer operador do MongoDB que comece com $, como $set, $gte ou $near, deverá colocá-lo entre aspas. Se você estiver usando o Ruby versão 2.2 ou superior, poderá anotá-lo da seguinte maneira:

collection.update_one({ name: "Harriet" }, { "$set": { age: 42 } })

Se você estiver usando uma versão anterior do Ruby, use o símbolo de hashrocket:

collection.update_one({ name: "Harriet" }, { "$set" => { age: 42 } })

As strings e hashrockets citadas para pares de valores-chave funcionarão com qualquer versão do Ruby:

collection.update_one({ "name" => "Harriet" }, { "$set" => { age: 42 } })

Para inserir documentos em uma coleção, selecione uma coleção no cliente e chame insert_one ou insert_many .

As operações de inserção retornam um objeto Mongo::Operation::Result que fornece informações sobre a própria inserção.

No MongoDB 2.6 e posterior, se a inserção falhar, uma exceção será gerada, pois os comandos de gravação são usados.

No MongoDB 2.4, uma exceção só será gerada se a inserção falhar e owrite concern for 1 ou superior.

client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music')
result = client[:artists].insert_one( { :name => 'FKA Twigs' } )
result.n # returns 1, because 1 document was inserted.
result = client[:artists].insert_many([
{ :name => 'Flying Lotus' },
{ :name => 'Aphex Twin' }
])
result.inserted_count # returns 2, because 2 documents were inserted.

Novidade na versão 3.4.

Decimal128 é um tipo de dados BSON que emprega valores de ponto flutuante baseados em decimais de 128bits capazes de emular arredondamento decimal com precisão exata. Esta funcionalidade destina-se a aplicações que lidam com dados monetários, como computação financeira e fiscal.

O exemplo seguinte insere um valor do tipo Decimal128 no campo price de uma collection denominada inventory:

client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'test')
price = BSON::Decimal128.new("428.79")
client[:inventory].insert_one({ "_id" => 1,
"item" => "26 inch monitor",
"price" => price })

A operação acima produz o seguinte documento:

{ "_id" : 1, "item" : "26 inch monitor", "price" : NumberDecimal("428.79") }

Você também pode criar um objeto Decimal128 a partir de um objeto Ruby BigDecimal ou com Decimal128.from_string().

big_decimal = BigDecimal.new(428.79, 5)
price = BSON::Decimal128.new(big_decimal)
# => BSON::Decimal128('428.79')
price = BSON::Decimal128.from_string("428.79")
# => BSON::Decimal128('428.79')

O driver Ruby fornece um cache de query. Quando ativado, o cache de query salvará os resultados das querys de busca e agregação e retornará os resultados salvos quando as mesmas queries forem realizadas novamente.

Para saber mais sobre o cache de query, acesse o tutorial do cache de query.

O driver Ruby fornece uma interface fluente para query utilizando o método find na collection. Várias opções estão disponíveis para o método find .

A query é executada lentamente no servidor somente ao iterar os resultados - nesse ponto, a query é despachada e um Mongo::Cursor é retornado.

Para encontrar todos os documentos para um determinado filtro, chame find com a query:

client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music')
client[:artists].find(:name => 'Flying Lotus').each do |document|
#=> Yields a BSON::Document.
end

Para query documento aninhados, especifique as chaves em ordem aninhada usando notação de ponto.

client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music')
client[:artists].find("records.releaseYear": 2008).each do |document|
#=> Yields a BSON::Document.
end

Este uso é preterido.

O find método permite fornecer a query e as opções usando a $query sintaxe legado no primeiro parâmetro:

collection.find(:'$query' => {name: 'Mr. Smith'})
# Equivalent to:
collection.find(name: 'Mr. Smith')
collection.find(:'$query' => {name: 'Mr. Smith'}, :'$sort' => {age: 1})
# Equivalent to:
collection.find(name: 'Mr. Smith').sort(age: 1)

Quando a query é executada no MongoDB 3.2 ou mais recente, o driver usará o protocolo apropriado para a versão do servidor em questão, convertendo automaticamente a query, conforme necessário, em um comando find ou em uma carga útil OP_MSG.

Para adicionar opções a uma query, encadeie os métodos apropriados após o método find . Observe que o objeto subjacente, o Mongo::Collection::View, é imutável e um novo objeto será retornado após cada chamada de método.

client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music')
documents = client[:artists].find(:name => 'Flying Lotus').skip(10).limit(10)
documents.each do |document|
#=> Yields a BSON::Document.
end

Veja a seguir uma lista completa das opções disponíveis que podem ser adicionadas ao executar queries e seus métodos correspondentes como exemplos.

Opção
Descrição

allow_disk_use

When set to true, the server can write temporary data to disk while executing the find operation. Esta opção só está disponível nas versões 4.4 e mais recentes do MongoDB Server.

allow_partial_results

Para uso com clusters fragmentados. Se um fragmento estiver inativo, permite que a query retorne resultados dos fragmentos que estão ativos, potencialmente obtendo apenas uma parte dos resultados.

batch_size(Integer)

Especifica o tamanho de cada lote de documentos que o cursor retornará em cada operação GETMORE .

comment(String)

Adiciona um comentário à query.

explain(**opts)

Retorna o plano de query para a query. Passe as opções de explicação por meio dos argumentos de palavra-chave usando chaves de símbolo.

# All server versions - default explain behavior
client[:artists].find.explain
# MongoDB 3.0 and newer
client[:artists].find.explain(verbosity: :query_planner)
client[:artists].find.explain(verbosity: :execution_stats)
client[:artists].find.explain(verbosity: :all_plans_execution)
# Alternative syntax using camel case
client[:artists].find.explain(verbosity: "queryPlanner")
client[:artists].find.explain(verbosity: "executionStats")
client[:artists].find.explain(verbosity: "allPlansExecution")
# MongoDB 2.6
client[:artists].find.explain(verbose: true)

A operação de explicação suporta as opções :session e :read (para read preference). Para especificar essas opções para uma única operação de explicação, elas devem ser fornecidas ao método find da seguinte forma:

client[:artists].find({}, session: session).explain
client[:artists].find({}, read: {mode: :secondary_preferred}).explain

Se a preferência de leitura for especificada no cliente ou na collection, ela será passada para a operação de explicação:

client[:artists, read: {mode: :secondary_preferred}].find.explain

Observe que a opção de sessão não é aceita ao criar um objeto de coleção.

O comando explain não suporta a passagem da opção de referência de leitura. Se a referência de leitura for especificada no nível do cliente ou da collection, ou se a referência de leitura for especificada como uma opção de localização, ela NÃO será passada pelo driver para o comando de explicação.

As informações retornadas pelo servidor para o comando explain variam de acordo com a versão do servidor e a topologia do sistema. O método explain do driver retorna o que o servidor forneceu.

O valor de retorno do método ``explain`` não faz parte da API pública do driver e depende da versão do servidor e da topologia de implantação.

hint(Hash)

Fornece à query uma dica de índice a ser usada.

let(Hash)

Mapeamento de variáveis a serem usadas na query.

limit(Integer)

Limita o número de documentos retornados ao valor fornecido.

max_scan(Integer)

Define o número máximo de documentos a serem digitalizados se uma varredura de collection completa for executada. Descontinuado a partir da versão 4.0 do MongoDB Server.

max_time_ms(Integer)

A quantidade máxima de tempo para permitir a execução da query, em milissegundos.

no_cursor_timeout

O MongoDB fecha automaticamente os cursores inativos após um período de 10 minutos. Chame isso para que os cursores permaneçam abertos indefinidamente no servidor.

projection(Hash)

Especifica os campos a serem incluídos ou excluídos dos resultados.

client[:artists].find.projection(:name => 1)

read(Hash)

Altera a preferência de leitura apenas para esta query.

client[:artists].find.read(:mode => :secondary_preferred)

session(Session)

A sessão a ser usada.

show_disk_loc(Boolean)

Informa aos resultados que também incluam a localização dos documentos no disco.

skip(Integer)

Ignore o número fornecido de documentos nos resultados.

snapshot

Execute a query no modo de snapshot. Descontinuado a partir da versão 4.0 do MongoDB Server.

sort(Hash)

Especifica os critérios de classificação para a query.

client[:artists].find.sort(:name => -1)
count_documents
Obtenha o número total de documentos correspondentes a um filtro ou o número total de documentos em uma coleção.
client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music')
client[:artists].find(:name => 'Flying Lotus').count_documents
estimated_document_count

Obtenha um número aproximado de documento na collection.

Observe que, ao contrário de count_documents, estimated_document_count não aceita um filtro.

O comando do servidor count é utilizado para implementar o estimated_document_count. Mais informações podem ser encontradas em Contagem: comportamento.

Due to an oversight in MongoDB versions 5.0.0-5.0.7, the count command, which estimated_document_count uses in its implementation, was not included in v1 of the Stable API. Portanto, recomenda-se que os usuários da API estável com estimated_document_count atualizem a versão do servidor para 5.0.8+ ou definam api_strict: false para evitar erros.

client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music')
client[:artists].estimated_document_count
count

Obtenha um número aproximado de documentos correspondentes a um filtro ou um número aproximado de documentos na coleção.

Obsoleto: o método count está obsoleto e não funciona em transação. Use count_documents para obter uma contagem exata de documento que podem corresponder a um filtro ou estimated_document_count para obter um número aproximado de documento na collection.

client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music')
client[:artists].find(:name => 'Flying Lotus').count
distinct
Filtra documentos com valores duplicados. Equivalente à cláusula SQL distinct .
client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music')
client[:artists].find.distinct(:name )

Para capped collections , você pode usar um cursor tailable que permanece aberto depois que o cliente esgota os resultados no cursor inicial. O seguinte exemplo de código mostra como um cursor tailable pode ser usado:

client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music')
client[:artists].drop
client[:artists, capped: true, size: 512].create
result = client[:artists].insert_many([
{ :name => 'Flying Lotus' },
{ :name => 'Aphex Twin' }
])
enum = client[:artists].find({}, cursor_type: :tailable_await).to_enum
while true
doc = enum.next
# do something
sleep(1)
end

A read concern pode ser definida no cliente ou na coleção:

client = Mongo::Client.new(['localhost:14420'], database: 'music',
read_concern: {level: :local})
client['collection'].find.to_a
collection = client['collection', read_concern: {level: :majority}]
collection.find.to_a

Atualmente, o driver não suporta a configuração da referência de leitura em uma query individual.

A read concern pode ser especificada ao iniciar uma transação. Quando uma transação está ativa, qualquer read concern especificado no cliente ou na coleção é ignorado.

Ao usar o auxiliar de comando genérico, a referência de leitura pode ser especificada como parte do comando:

client.database.command(dbStats: 1, readConcern: {level: :majority})

A preferência de leitura determina os membros do conjunto de réplicas candidatos para os quais uma consulta ou comando pode ser enviado. Eles consistem em um modo especificado como um símbolo, uma array de hashes conhecidos como tag_sets, a opção hedge , que é um hash que especifica o comportamento de leitura distribuída e duas opções de tempo: local_threshold e server_selection_timeout.

local_threshold
Define o limite superior em segundos da janela de latência entre o servidor mais próximo e os servidores adequados para os quais uma operação pode ser enviada. O padrão é 15 milissegundos ou 0,015 segundos.
server_selection_timeout
Define por quanto tempo bloquear a seleção de servidor antes de lançar uma exceção. O padrão é 30.000 milissegundos ou 30 segundos.

Observação

A preferência de leitura não se aplica a sistemas autônomo. Quando um cliente é conectado a um autônomo, qualquer preferência de leitura especificada pela aplicação é ignorada.

Para obter mais informações sobre o algoritmo usado para selecionar um servidor, consulte a documentação de Seleção de Servidor do MongoDB, disponível no Github.

A preferência de leitura pode ser definida como uma opção no cliente ou passada como uma opção quando um comando é executado em um reconhecimento de data center:

# Set read preference on a client, used for all operations
client = Mongo::Client.new([ '127.0.0.1:27017' ],
read: { mode: :secondary,
tag_sets: [ { 'dc' => 'nyc' } ]
} )
# Set read preference for a given command
client.database.command( { dbStats: 1 }, read: { mode: secondary,
tag_sets: [ { 'dc' => 'nyc' } ] } )

A preferência de leitura também pode ser definida para operações específicas em uma collection utilizando o método with :

client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music')
artists = client[:artists]
artists.with(:read => { :mode => :primary_preferred }).find.to_a

Existem cinco modos de read preference possíveis: :primary, :secondary, :primary_preferred, :secondary_preferred e '':mais próximo''. Consulte a documentação de preferência de leitura no Manual MongoDB para obter uma explicação dos modos.

Observação

Quando um cliente é conectado diretamente a um servidor usando a opção :direct_connection Ruby ou a opção directConnection URI, o modo de preferência de leitura é definido automaticamente como :primary_preferred para permitir operações de leitura em relação a secundários. Se a aplicação especificou um modo de preferência de leitura :primary, o modo será convertido automaticamente para :primary_preferred. Se outro modo de preferência de leitura for especificado, ele será passado para o servidor inalterado.

O parâmetro tag_sets é uma lista ordenada de conjuntos de tags usado para restringir a elegibilidade dos servidores para seleção, como para o reconhecimento do centro de dados. Consulte a documentação de preferência de leitura no Manual MongoDB para obter uma explicação dos conjuntos de tags.

Um conjunto de tags de preferência de leitura (T) corresponde a um conjunto de tags de servidor (S) – ou, equivalentemente, um conjunto de tags de servidor (S) corresponde a um conjunto de tags de preferência de leitura (T) – se T for um subconjunto de S.

Por exemplo, o conjunto de tags da preferência de leitura { dc: 'ny', rack: 2 } corresponde a um servidor secundário com o conjunto de tags { dc: 'ny', rack: 2, size: 'large' }.

Um conjunto de tags que é um documento vazio corresponde a qualquer servidor, porque o conjunto de tags vazio é um subconjunto de qualquer conjunto de tags. Isso significa que o tag_sets parâmetro padrão [{}] corresponde a todos os servidores.

O parâmetro hedge é um Hash que especifica se o servidor deve usar leituras protegidas. Com leituras protegidas, clusters fragmentados podem rotear operações de leitura para dois membros do conjunto de réplicas e retornar resultados do primeiro respondente.

A opção hedge só pode ser especificada em preferências de leitura não primárias. Deve ser fornecido como Hash com a chave enabled definida como true ou false.

client = Mongo::Client.new(
[ '127.0.0.1:27017' ],
read: { mode: :secondary, hedge: { enabled: true } },
)

Consulte o Manual do MongoDB para obter mais informações sobre leituras protegidas.

Observação

A opção hedge está disponível somente nas versões 4.4 e mais recentes do MongoDB Server. Tentar usar essa opção em versões mais antigas do servidor resultará em um erro.

A atualização de documentos é possível executando uma atualização única ou múltipla, ou usando o comando $findAndModify .

update_one

client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music')
artists = client[:artists]
result = artists.find(:name => 'Goldie').update_one("$inc" => { :plays => 1 } )
result.n # Returns 1.
result = artists.update_one( { :name => 'Goldie' }, { "$inc" => { :plays => 1 } } )
result.n # Returns 1.

update_many

result = artists.find(:label => 'Hospital').update_many( "$inc" => { :plays => 1 } )
result.modified_count # Returns the number of documents that were updated.
result = artists.update_many( { :label => 'Hospital' }, { "$inc" => { :plays => 1 } } )
result.modified_count # Returns the number of documents that were updated.

replace_one

result = artists.find(:name => 'Aphex Twin').replace_one(:name => 'Richard James')
result.modified_count # Returns 1.
result = artists.replace_one( { :name => 'Aphex Twin' }, { :name => 'Richard James' } )
result.modified_count # Returns 1.

Para atualizar documentos e retornar um documento via $findAndModify, use um dos três auxiliares fornecidos: find_one_and_delete, find_one_and_replace ou find_one_and_update. Você pode optar por devolver o documento antes ou depois da modificação ocorrer.

find_one_and_delete

client = Mongo::Client.new( [ '127.0.0.1:27017' ], :database => 'music')
artists = client[:artists]
artists.find(:name => 'José James').find_one_and_delete # Returns the document.

find_one_and_replace

doc = artists.find(:name => 'José James').find_one_and_replace(:name => 'José')
doc # Return the document before the update.
doc = artists.find_one_and_replace({ :name => 'José James' }, { :name => 'José' })
doc # Return the document before the update.
doc = artists.find(:name => 'José James').
find_one_and_replace( { :name => 'José' }, :return_document => :after )
doc # Return the document after the update.

find_one_and_update

doc = artists.find(:name => 'José James').
find_one_and_update( '$set' => { :name => 'José' } )
doc # Return the document before the update.
doc = artists.find_one_and_update( { :name => 'José James' }, { '$set' => { :name => 'José' } } )
doc # Return the document before the update.

Para adicionar opções a um comando de atualização, especifique-as como pares de valores-chave no argumento Hash de opções.

client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music')
artists = client[:artists]
artists.indexes.create_one(name: 1)
# Force the server to use the name index to perform this operation
result = artists.update_one(
{ :name => 'Goldie' },
{ "$inc" => { :plays => 1 } },
{ hint: { name: 1 } }
)
result.n # Returns 1.

A seguir está uma lista das opções que podem ser adicionadas às operações de atualização, incluindo update_one, update_many, replace_one, find_one_and_delete, find_one_and_update e find_one_and_replace.

Opção
Descrição

array_filters

Uma matriz de documentos de filtro que determina quais elementos da matriz modificar para uma operação de atualização em um campo da matriz.

bypass_document_validation

Se a validação em nível de documento deve ser ignorada antes de gravar o documento.

collation

Especifica um conjunto de regras a serem usadas ao comparar strings em conformidade com as convenções de um idioma específico.

hint

O índice a ser usado para essa operação. Pode ser especificado como um Hash (por exemplo { _id: 1 }) ou como uma cadeia de caracteres (por exemplo, "_id_"). Suportado nas versões 4.2 e mais recentes do MongoDB Server para comandos update_one, update_many e replace_one e nas versões 4.4 e mais recentes do MongoDB Server para comandos find_one_and_delete, find_one_and_update e find_one_and_replace .

let(Hash)

Mapeamento de variáveis a serem usadas para esta operação.

projection

Os campos a serem excluídos ou incluídos no resultado da operação (disponível somente nos comandos find_one_and_delete, find_one_and_replace e find_one_and_update ).

return_document

Um símbolo que especifica se o documento atualizado deve ser retornado como estava antes ou depois da atualização. Os valores possíveis são :before ou :after. (Somente disponível em comandos find_one_and_update e find_one_and_replace ).

sort

Como classificar os resultados de um comando de localizar e modificar. Especificado como um par de chave-valor de Hash, onde a chave é o nome do campo para classificar por e o valor é 1 ou -1, especificando uma classificação em ordem crescente ou decrescente (disponível somente em find_one_and_delete, find_one_and_replace e comandos find_one_and_update ).

session

A sessão a ser usada para essa operação.

upsert

Se deve ser atualizado se o documento não existir. Não pode ser usado na operação find_one_and_delete .

Para obter mais informações sobre as opções de atualização, consulte a documentação do MongoDB Server sobre os seguintes comandos:

  • update

  • encontrar e modificar

delete_one

client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music')
artists = client[:artists]
result = artists.find(:name => 'Björk').delete_one
result.deleted_count # Returns 1.
result = artists.delete_one(:name => 'Björk')
result.deleted_count # Returns 1.

delete_many

result = artists.find(:label => 'Mute').delete_many
result.deleted_count # Returns the number deleted.
result = artists.delete_many(:label => 'Mute')
result.deleted_count # Returns the number deleted.

Para adicionar opções a um comando de exclusão, especifique-as como pares de valores-chave no argumento Hash de opções.

client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music')
artists = client[:artists]
artists.indexes.create_one(name: 1)
# Force the server to use the name index to perform this operation
result = artists.find(:name => 'Björk').delete_one(hint: { name: 1 })
result.deleted_count # Returns 1.

A seguir está uma lista completa das opções disponíveis que podem ser adicionadas às operações delete_one e delete_many .

Opção
Descrição

collation

Especifica um conjunto de regras a serem usadas ao comparar strings em conformidade com as convenções de um idioma específico.

hint

O índice a ser usado para essa operação. Pode ser especificado como um Hash (por exemplo { _id: 1 }) ou como uma cadeia de caracteres (por exemplo, "_id_"). Compatível com as versões 4.4 e mais recentes do MongoDB Server.

let(Hash)

Mapeamento de variáveis a serem usadas para esta operação.

session

A sessão a ser usada para essa operação.

Para obter mais informações sobre as opções de atualização, consulte a documentação do servidor MongoDB no comando delete.

Todas as operações de gravação no MongoDB são executadas com um write concern, que é o nível de confirmação solicitado do MongoDB para a gravação específica. Mais informações sobre write concerns em geral estão disponíveis no manual do MongoDB.

O driver Ruby suporta a especificação de referência de escrita nos níveis de cliente, collection, sessão (para transação nessa sessão), transação, bucket GridFS e fluxo de gravação, bem como ao emitir comandos manualmente via Database#command.

A partir da versão 2.10 do driver, todos os objeto de driver que aceitam referência de escrita o fazem por meio da opção :write_concern , que deve receber um hash com as opções de referência de escrita. O uso da opção :write está obsoleto. Nas versões 2.9 e inferiores do driver, os objeto client, collection e GridFS usavam opções de write concern na opção :write com objeto de sessão e transação empregando a opção :write_concern .

Abaixo estão alguns exemplos de como passar referência de escrita para objeto de cliente e collection. A opção :write_concern pode ser fornecida ao construir novo objeto de cliente e collection, ou para os métodos #with .

Exemplos de GridFS são fornecidos na página do GridFS .

client = Mongo::Client.new([ '127.0.0.1:27017' ], database: 'music',
write_concern: {w: 2})
alt_client = client.with(write_concern: {w: :majority})
collection = client[:artists, write_concern: {w: 3}]
alt_collection = collection.with(write_concern: {w: :majority})
# Uses w: 3
collection.insert_one({name: 'SUN Project'})
# Uses w: :majority
alt_collection.insert_one({name: 'SUN Project'})

As versões 2.9 e anteriores do driver aceitaram referência de escrita no nível do cliente e da collection por meio da opção :write . Esse uso continua a ser suportado para compatibilidade com versões anteriores, mas está obsoleto:

client = Mongo::Client.new([ '127.0.0.1:27017' ], database: 'music',
write: {w: 2})
alt_client = client.with(write: {w: :majority})
collection = client[:artists, write: {w: 3}]
alt_collection = collection.with(write: {w: :majority})

Se as opções :write e :write_concern forem fornecidas, seus valores deverão ser idênticos ou uma exceção será gerada:

# OK
client = Mongo::Client.new([ '127.0.0.1:27017' ], database: 'music',
write_concern: {w: 3}, write: {w: 3})
# Error
client = Mongo::Client.new([ '127.0.0.1:27017' ], database: 'music',
write_concern: {w: 3}, write: {w: :majority})

Quando os métodos #with são usados para alterar as opções em um cliente ou collection, a última opção fornecida ganha no caso de diferenças de nomeação:

client = Mongo::Client.new([ '127.0.0.1:27017' ], database: 'music',
write_concern: {w: 2})
alt_client = client.with(write: {w: 3})
alt_client.options[:write]
# => {"w"=>3}
alt_client.options[:write_concern]
# => nil

Ao usar transações, a write concern só é enviada ao servidor nas operações commit_transaction e abort_transaction acordo com a especificação de transações . A write concern pode ser definida por meio da opção :write_concern em uma chamada with_transaction ou start_transaction , ou por meio da opção default_transaction_options em um objeto de sessão. Se nenhum desses estiver definido, a write concern do cliente será usada; Observe que as transações ignoram as write concerns de collections envolvidas em suas operações. Observe que, ao definir a write concern como uma opção de transação, a opção :write não é reconhecida por nenhuma versão do driver.

client = Mongo::Client.new([ '127.0.0.1:27017' ], database: 'music',
write_concern: {w: 2})
collection = client[:artists, write_concern: {w: :majority}]
session = client.start_session
session.with_transaction do
collection.insert_one({test: 1}, session: session)
# Uses w: 2 when committing
end
session = client.start_session(default_transaction_options:
{write_concern: {w: 3})
)
session.with_transaction do
collection.insert_one({test: 1}, session: session)
# Uses w: 3 when committing
end
session = client.start_session
session.with_transaction(write_concern: {w: 3}) do
collection.insert_one({test: 1}, session: session)
# Uses w: 3 when committing
end

Quando as referências de escrita são herdadas, a herança se aplica a todo o hash da referência de escrita em vez de a elementos individuais. Por exemplo, j: true não é herdado no seguinte caso:

client = Mongo::Client.new([ '127.0.0.1:27017' ], database: 'music',
write_concern: {w: 1, j: true})
collection = client[:artists, write_concern: {w: 2}]
collection.write_concern.options
# => #<Mongo::WriteConcern::Acknowledged:0x47289650367880 options={:w=>2}>

Embora as operações CRUD aceitem um hash de opções, elas atualmente não reconhecem a opção :write_concern :

client = Mongo::Client.new([ '127.0.0.1:27017' ], database: 'music',
write_concern: {w: 2})
collection = client[:artists, write_concern: {w: :majority}]
# Still uses w: :majority
collection.insert_one({name: 'SUN Project'}, write_concern: {w: 1})

A solução alternativa mais fácil para isso é usar #with para obter uma nova instância de collection com a referência de escrita desejada:

# Uses w: 1
collection.with(write_concern: {w: 1}).insert_one(name: 'SUN Project')

A referência de escrita também pode ser especificada manualmente em Database#command:

client.database.command(create: 'foo-collection', writeConcern: {w: :majority})

Observe que writeConcern aqui é parte da operação em vez de opções, e a sintaxe é o camel case que o MongoDB Server reconhece, não o sublinhado que o driver Ruby usa.

A partir da mongo Ruby versão { } do driver 2.18.0, a capacidade de trabalhar com campos que começam com cifrões ($) e campos com pontos/pontos finais (.) está disponível. Na versão 2.17.0 e anteriores do Driver, qualquer tentativa de trabalhar com campos pontilhados ou em dólares resultaria na criação de um erro IllegalKey . Consulte os MongoDB Docs do sobre Nomes de campo com pontos (.) e assinaturas em dólares ($) para obter mais informações sobre como trabalhar com esses tipos de campos.

Como a especificação BSON preteriu o tipo de símbolo BSON, a joia bson serializará os símbolos Ruby em cadeias de caracteres BSON quando usada sozinha. No entanto, para manter a compatibilidade com o conjuntos de dados mais antigos, o driver Ruby substitui esse comportamento para serializar símbolos Ruby como símbolos BSON. Isso é necessário para que seja possível especificar query para documento que contenham símbolos BSON como campo. Apesar disso, novos documentos com campos do tipo símbolo não devem ser armazenados no banco de dados; em vez disso, use campos de string.

Para substituir o comportamento padrão e configurar o driver para codificar valores de símbolo como strings, inclua o seguinte trecho de código em seu projeto:

class Symbol
def bson_type
BSON::String::BSON_TYPE
end
end

Voltar

Trabalhando com dados