Operações CRUD
Nesta página
As operações CRUD são aquelas que lidam com a criação, leitura, atualização e exclusão de documentos.
Notação de par de valores-chave
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 } })
Criar documentos
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.
Especifique um Decimal128
número
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')
Cache de consulta
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.
Leitura
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
Sintaxe do $query
herdado
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.
Opções de query
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.
A operação de explicação suporta as opções
Se a preferência de leitura for especificada no cliente ou na collection, ela será passada para a operação de explicação:
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 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.
| |||||||||||||||||||
read(Hash) | Altera a preferência de leitura apenas para esta query.
| |||||||||||||||||||
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.
|
Operações de query adicionais
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 oestimated_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, whichestimated_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 comestimated_document_count
atualizem a versão do servidor para 5.0.8+ ou definamapi_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. Usecount_documents
para obter uma contagem exata de documento que podem corresponder a um filtro ouestimated_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 )
Cursores persistentes
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
Preocupação de leitura
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})
readPreference
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
Modo
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.
Conjuntos de tags
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.
Cobertura
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.
Atualizando
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.
UpdateOptions
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:
Excluindo
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.
Excluir opções
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.
Escreva preocupação
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.
Nomes de campo com pontos/pontos finais (.) e cifrões ($)
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.
Uma observação sobre o tipo de símbolo BSON
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