Menu Docs

Página inicial do DocsGo

Trabalhe com BSON

Nesta página

  • Visão geral
  • Tipos de dados
  • Marcações de estrutura
  • Desordenação

Neste guia, você aprenderá como o Go Driver lida com conversões entre valores BSON e Go. O processo de conversão de um valor Go para BSON é chamado de ordenação, enquanto o processo inverso é chamado de desordenação.

Leia este guia se quiser saber mais sobre como o Go Driver representa dados BSON ou se precisar ajustar os comportamentos padrão de ordenação e desordenação.

O MongoDB armazena documentos em uma representação binária denominada BSON que permite o processamento de dados fácil e flexível.

O driver Go oferece quatro tipos principais de trabalho com dados BSON:

  • D: Uma representação ordenada de um documento BSON (fatia)

  • M: Uma representação não ordenada de um documento BSON (mapa)

  • A: Uma representação ordenada de uma array BSON

  • E: Um único elemento dentro de um tipo D

O exemplo a seguir demonstra como construir um filtro de query usando o tipo bson.D para corresponder a documentos com um valor de campo quantity maior que 100:

filter := bson.D{{"quantity", bson.D{{"$gt", 100}}}}

Para saber mais sobre como o driver Go lida com os dados BSON, consulte a documentação da API do pacote bson.

No Go, uma estrutura é uma collection de campos de dados com tipos de dados declarados. O Go Driver pode organizar/desordenar estruturas e outros tipos nativos do Go de/para o BSON usando um sistema de codec configurável.

Você pode modificar o comportamento padrão de transferência e remoção de transferência do Go Driver usando marcações de estrutura, que são partes opcionais de metadados anexadas aos campos de estrutura. O uso mais comum de marcações de estrutura é especificar o nome do campo no documento BSON que corresponde ao campo estruturado. A tabela a seguir descreve as marcações de estrutura adicionais que você pode usar com o Go Driver:

Marcação de estrutura
Descrição
omitempty
O campo não será ordenado se estiver definido para o valor zero correspondente ao tipo de campo.
minsize
Se o tipo de campo for do tipo int64, uint, uint32 ou uint64 e o valor do campo couber em um int32 assinado, o campo será serializado como um BSON int32 em vez de um BSON int64. Se o valor não couber em um int32 registrado, esta marcação será ignorada.
truncate
Se o tipo de campo for um tipo numérico não flutuante, o que BSON dobrar sem ordenação nesse campo será truncado no ponto decimal.
inline
Se o tipo de campo for um campo de estrutura ou mapa, o campo será achatado ao ser ordenado e não será achatado ao ser desordenado.

Sem instruções adicionais de marcações de estrutura, o Go Driver organizará as estruturas usando as seguintes regras:

  1. O Go Driver apenas ordena e desordena os campos exportados.

  2. O Go Driver gera a chave BSON usando a letra minúscula do campo de estrutura correspondente.

  3. O Go Driver ordena campos de estrutura integrados como subdocumentos. Cada chave é a letra minúscula do tipo de campo.

  4. O Go Driver ordena um campo de ponteiro como o tipo subjacente se o ponteiro não for nulo. Se o ponteiro for nulo, o driver o organizará como um valor nulo BSON.

  5. Ao desordenar, o Go Driver segue esses mapeamentos tipo D/M para campos do tipo interface{}. O driver desordena documentos BSON desordenados em um campo interface{} como um tipo D .

Você pode desordenar documentos BSON utilizando o método Decode() no resultado do método FindOne ou qualquer instância *mongo.Cursor.

O método Decode() retorna um tipo de error que contém um dos seguintes valores:

  • nil se um documento corresponder à sua query e não houver erros ao recuperar e desordenar o documento.

  • Se o driver recuperou o documento, mas não pôde desordenar o resultado, o método Decode() retorna o erro de desordenação.

  • Se houver um erro ao recuperar seu documento durante a execução do método FindOne(), o erro se propagará para o método Decode() e o método Decode() retornará o erro.

Quando utilizado no tipo SingleResult retornado pelo método FindOne(), o Decode() também pode retornar o erro ErrNoDocuments se nenhum documento corresponder ao filtro de query.

O exemplo seguinte demonstra como você pode utilizar o método Decode() para desordenar e ler o resultado de uma operação simples do FindOne():

coll := client.Database("school").Collection("students")
filter := bson.D{{"age", 8}}
var result bson.D
err := coll.FindOne(context.TODO(), filter).Decode(&result)
fmt.Println(result)

O tipo Cursor também utiliza o método All(), que une todos os documentos armazenados no cursor em uma array ao mesmo tempo.

O pacote bson inclui uma família de métodos Marshal() e Unmarshal() que funcionam com dados codificados por BSONs do tipo []byte.

O código a seguir demonstra como você pode desordenar o BSON de volta para uma estrutura definida pelo usuário usando métodos do pacote bson:

type Item struct {
Category string
Quantity int32
}
doc, err := bson.Marshal(bson.D{{"category", "plate"}, {"quantity", 6}})
var test Item
err = bson.Unmarshal(doc, &test)
fmt.Printf("Unmarshalled Struct:\n%+v\n", test)

Observação

Você pode usar o tipo Raw para recuperar elementos de uma fatia de bytes de documento BSON sem desordená-lo para um valor Go. Isso pode ser útil se você precisar procurar elementos individuais sem desordenar todo o documento BSON.

Para saber mais sobre os métodos de ordenação e desordenação usados com o tipo Cursor, consulte a documentação da API do cursor

Para saber mais sobre os métodos de ordenação e desordenação no pacote bson, consulte a documentação da API do bson

←  Mecanismos de autenticaçãoOperações CRUD →
Dê Feedback
© 2022 MongoDB, Inc.

Sobre

© 2022 MongoDB, Inc.