Menu Docs
Página inicial do Docs
/
MongoDB Atlas
/ / /

Definir caminho para dados S3

Nesta página

  • Visão geral
  • Funções de análise suportadas
  • Analisando valores nulos de nomes de arquivos
  • Analisando números preenchidos de nomes de arquivos
  • Funções de análise não suportadas
  • Exemplos
  • Analisar Campo Único do Nome do Arquivo
  • Analisar vários campos do nome do arquivo
  • Usar Expressão Regular para Analisar Campos do Nome do Arquivo
  • Identifique intervalos de dados consultáveis a partir do nome do arquivo
  • Identificar campos aninhados a partir do nome do arquivo
  • Criar partições a partir de ObjectIds
  • Criar partições a partir do caminho do arquivo
  • Criar partições a partir do ISODate
  • Gerar nomes de coleção dinâmicos a partir do caminho do arquivo

Quando você faz query de documentos em seus buckets S3 , o valor path do Atlas Data Federation permite que o Data Federation mapeie os dados dentro do documento para o nome do arquivo do documento.

path suporta a análise de nomes de arquivos em buckets S3 em campos calculados. O Data Federation pode adicionar os campos calculados a cada documento gerado a partir do arquivo analisado. O Data Federation pode direcionar queries nesses valores de campo computados apenas para os arquivos com um nome de arquivo correspondente. Consulte Funções de análise suportadas e exemplos para obter mais informações.

path também suporta a criação de partições usando atributos de partição no caminho para o arquivo. O Data Federation pode direcionar queries no parâmetro definido no atributo de partição apenas para os arquivos que contêm a query no nome do arquivo ou no prefixo da partição.

Exemplo

Considere os seguintes arquivos em seu bucket S3 :

/users/26/1234.json
/users/26/5678.json

O documento JSON 1234.json contém o seguinte:

{
"name": "jane doe",
"age": 26,
"userID": "1234"
}

sua configuração de instância do reconhecimento de data center federado para os arquivos no seu bucket S3 define o seguinte path:

"path": "/users/{age int}/{userID string}"

O seguinte mostra como o Data Federation mapeia uma query para as partições criadas a partir da definição path :

db.users.findOne( /users
{ /40
"age": 26 -----------------> /26
"userID": "1234" ----------> /1234.json
} /5678.json
)

Se o campo calculado para o atributo de partição já existir em seu documento, o Data Federation mapeará sua consulta para o arquivo apropriado. Se o campo calculado não existir, o Data Federation adicionará o campo calculado ao documento. Por exemplo, se o campo age não existir em 1234.json, o Data Federation adicionará o campo age e o valor a 1234.json.

Você pode especificar uma única função de análise no nome do arquivo.
/path/to/files/{<fieldA> <data-type>}
Você pode especificar múltiplas funções de análise no nome do arquivo.
/path/to/files/{<fieldA> <data-type>}-{<fieldB> <data-type>}
Você pode especificar funções de análise junto com strings estáticas no nome do arquivo:
/path/to/files/prefix-{<fieldA> <data-type>}-suffix
Você pode especificar ponto (ou seja, .) ao longo do caminho para o nome do arquivo.
/path/to/files/{<fieldA>.<fieldB> <data-type>}
Você pode especificar ObjectIds no caminho para os arquivos para criar partições.
/path/to/files/{objid objectid}
Você pode especificar um intervalo de ObjectIds no caminho para os arquivos para criar partições.
/path/to/files/{min(obj) objectid}-{max(obj) objectid}
Você pode especificar funções de análise ao longo do caminho para o nome do arquivo.
/path/{<fieldA> <data-type>}/{<fieldB> <data-type>}/{<fieldC> <data-type>}/*
Você pode especificar regex para ISODate ao longo do caminho para o nome do arquivo.
/path/to/files/{<field-name> isodate("<date-format>"):\\<regex>}

Observação

Ao especificar o path:

  • Especifique o tipo de dados para o atributo de partição.

  • Certifique-se de que o tipo de atributo de partição corresponda ao tipo de dados para analisar.

  • Utilize o delimitador especificado em delimiter.

Ao especificar atributos do mesmo tipo, faça qualquer um dos seguintes:

O Data Federation analisa automaticamente uma string vazia ("") no lugar de um atributo no caminho do arquivo como o valor nulo BSON para todos os tipos de atributo do Atlas Data Federation, exceto string. Com um string, a string vazia pode representar um valor nulo BSON ou um valor de string vazia BSON. O Atlas Data Federation não analisa nenhum valor BSON para o tipo de atributo string . Isso evita adicionar um valor de BSON com um tipo conflitante aos documentos lidos no S3.

Exemplo

Considere o seguinte armazenamento de instância do banco de dados federado do S3 :

/records/january/1.json
/records/february/1.json
/records//1.json
For the path ``/records/{month string}/*``, Data Federation does not add any
computed fields for the ``month`` attribute to documents generated
from the third record in the above store.

Observação

Ao gravar arquivos no S3, grave valores nulos BSON como strings vazias em nomes de arquivos para todos os tipos de atributo do Atlas Data Federation.

O caminho do arquivo pode incluir valores numéricos preenchidos com zeros à esquerda. Para que o Data Federation analise corretamente os valores numéricos acolchoados para tipos de atributo como int, epoch_millis e epoch_secs, especifique o número de dígitos no valor usando expressões regulares.

Exemplo

Considere uma loja S3 com os seguintes arquivos:

|--users
|--001.json
|--002.json
...

A seguinte sintaxe do path utiliza uma expressão regular para especificar o número de dígitos no nome do arquivo. O Data Federation identifica a parte do caminho que corresponde ao atributo de partição e, em seguida, mapeia esse atributo de partição para um tipo int:

/users/{user_id int:\\d{3}}

Especificar funções de análise consecutivas no mesmo nome de arquivo sem nenhuma maneira de diferenciá-las pode levar a resultados inconsistentes.

Exemplo

Considere uma loja S3 com os seguintes arquivos:

|--food
|--icecream
|--peanutbutter

Agora considere o seguinte caminho para os arquivos no diretório food :

/food/{first string}{second string}/

Não há como determinar qual parte da substring do nome do arquivo deve corresponder aos atributos de string first versus second . Portanto, o Atlas Data Federation corresponde tudo a first.

Considere usar atributos com regex semelhantes aos seguintes:

  • /food/{first string:\\D{3}}{second string:\\D{5}}

    O caminho anterior especifica que first corresponde a 3 caracteres não numéricos e second corresponde aos próximos 5 caracteres não numéricos.

  • /food/{first string:[A-Z]{3}}{second string:[a-z]{5}}

    O caminho anterior corresponde a first a 3 letras maiúsculas e second a 5 letras minúsculas.

Os exemplos a seguir demonstram como analisar nomes de arquivos em campos calculados:

Considere um reconhecimento de data center instância do banco de dados federado accountingArchive contendo arquivos onde o nome do arquivo descreve uma data de fatura. Por exemplo, o nome do arquivo /invoices/1564671291998.json contém as faturas para o carimbo de data/hora UNIX 1564671291998.

O seguinte objeto databases gera um campo invoiceDate analisando o nome do arquivo como um carimbo de data/hora UNIX:

"databases" : [
{
"name" : "accounting",
"collections" : [
{
"name" : "invoices",
"dataSources" : [
{
"storeName" : "accountingArchive",
"path" : "/invoices/{invoiceDate epoch_millis}"
}
]
}
]
}
]

O Data Federation adiciona o campo computado e o valor a cada documento gerado a partir do nome do arquivo. Os documentos gerados a partir do nome do arquivo de exemplo incluem um campo invoiceDate: ISODate("2019-08-01T14:54:51Z"). As queries no campo invoiceDate podem ser direcionadas somente para os arquivos que correspondem ao valor especificado.

Considere um armazenamento de instância do banco de dados federado accountingArchive contendo arquivos onde o nome do arquivo descreve um número de fatura e data da fatura. Por exemplo, o nome do arquivo /invoices/MONGO12345-1564671291998.json contém a fatura MONGODB12345 do carimbo de data/hora UNIX 1564671291998.

O seguinte objeto databases gera:

  • Um campo invoiceNumber analisando o primeiro segmento do nome do arquivo como uma string.

  • Um campo invoiceDate analisando o segundo segmento do nome do arquivo como um carimbo de data/hora UNIX.

"databases" : [
{
"name": "accounting",
"collections" : [
{
"name" : "invoices",
"dataSources" : [
{
"storeName" : "accountingArchive",
"path" : "/invoices/{invoiceNumber string}-{invoiceDate epoch_millis}"
}
]
}
]
}
]

O Data Federation adiciona os campos e valores computados a cada documento gerado a partir do nome do arquivo. Os documentos gerados a partir do nome do arquivo de exemplo incluem os seguintes campos:

  • invoiceNumber : "MONGODB12345"

  • invoiceDate : ISODate("2019-08-01T14:54:51Z")

As queries que incluem os campos invoiceNumber e invoiceDate podem ser direcionadas somente para os arquivos que correspondem aos valores especificados.

Considere um armazenamento de instância do banco de dados federado accountingArchive contendo arquivos onde o nome do arquivo descreve um número de fatura e data da fatura. Por exemplo, o nome do arquivo /invoices/MONGODB12345-20190102.json contém a fatura MONGODB12345 para a data 20190102.

O seguinte objeto databases gera:

  • Um campo invoiceNumber analisando o primeiro segmento do nome do arquivo como uma string

  • Um campo year usando uma expressão regular para analisar somente os primeiros 4 dígitos do segundo segmento do nome do arquivo como um int.

  • Um campo month usando uma expressão regular para analisar somente os próximos 2 dígitos do segundo segmento do nome do arquivo como um int.

  • Um campo day usando uma expressão regular para analisar somente os próximos 2 dígitos do segundo segmento do nome do arquivo como um int.

"databases" : [
{
"name" : "accounting",
"collections" : [
{
"name" : "invoices",
"dataSources" : [
{
"storeName" : "accountingArchive",
"path" : "/invoices/{invoiceNumber string}-{year int:\\d{4}}{month int:\\d{2}}{day int:\\d{2}}"
}
]
}
]
}
]

O Data Federation adiciona os campos e valores computados a cada documento gerado a partir do nome do arquivo. Os documentos gerados a partir do nome do arquivo de exemplo incluem os seguintes campos:

  • invoiceNumber : "MONGODB12345"

  • year : 2019

  • month: 01

  • day: 02

Importante

Você deve trocar a string regex especificada em path. Por exemplo, se a string regex incluir aspas duplas, você deverá trocar esses valores. A Federação de Dados suporta a Sintaxe do Pacote para expressões regulares na configuração de armazenamento.

Queries que incluem todos os campos gerados podem ser direcionadas somente para os arquivos que correspondem aos valores especificados.

Dica

Veja também:

Considere um instância do banco de dados federado accountingArchive contendo arquivos onde o nome do arquivo descreve o intervalo de dados contidos no arquivo. Por exemplo, o nome do arquivo /invoices/1546367712000-1549046112000.json contém faturas para o período entre 01/01/2019 e 02/01/2019 com o intervalo de datas representado como milissegundos decorridos desde a Era UNIX.

O seguinte objeto databases identifica o intervalo de tempo mínimo como o primeiro segmento do nome do arquivo e o intervalo de tempo máximo como o segundo segmento do nome do arquivo:

"databases" : [
{
"name: "accounting",
"collections" : [
{
"name: "invoices",
"dataSources" : [
{
"storeName" : "accountingArchive",
"path" : "/invoices/{min(invoiceDate) epoch_millis}-{max(invoiceDate) epoch_millis}"
}
]
}
]
}
]

Quando o Data Federation recebe uma query no campo "invoiceDate" , ele usa o caminho especificado para identificar quais arquivos contêm os dados que correspondem à query.

As consultas no campo invoiceDate podem ser direcionadas somente para os arquivos cujo intervalo captura o valor especificado, incluindo a data min e max .

Importante

O campo especificado para os intervalos mínimo e máximo deve existir em todos os documentos contidos no arquivo para evitar comportamentos inesperados ou indesejados. O Data Federation não realiza nenhuma validação de que os dados subjacentes estejam em conformidade com essa restrição.

O Data Federation suporta a consulta de dados aninhados quando o valor de dados aninhados também é o nome do arquivo. Você pode usar o operador de ponto (ou seja, .) em seu path para mapear os atributos de partições em sua configuração de armazenamento para campos aninhados em seus documentos.

Considere um armazenamento de instância do banco de dados federado accountingArchive. O armazenamento da instância do banco de dados federado contém arquivos com nomes que correspondem aos valores dos campos aninhados nos documentos. Por exemplo:

accountingArchive
|--invoices
|--January.json
|--February.json
...

Suponha que o arquivo January.json contenha um documento com os seguintes campos:

{
"invoice": {
"invoiceNumber" : "MONGODB12345",
"year" : 2019,
"month": "January", //value matches filename
"date": 02
},
"vendor": "MONGODB",
...
}

O seguinte objeto databases identifica month como um campo aninhado dentro de um documento. O objeto databases também identifica o valor de month como o nome do arquivo que contém o documento.

"databases" : [
{
"name" : "accounting",
"collections" : [
{
"name" : "invoices",
"dataSources" : [
{
"storeName" : "accountingArchive",
"path" : "/invoices/{invoice.month string}"
}
]
}
]
}
]

Quando o Atlas Data Federation recebe uma query em um mês específico como January, ele utiliza o caminho especificado para identificar qual arquivo contém os dados que correspondem à query.

Você pode especificar ObjectIds no caminho para os arquivos. Para arquivos que contêm ObjectId no nome do arquivo, o Atlas Data Federation cria partições para cada ObjectId.

Consider the following federated database instance store, accountingArchive. Este armazenamento de dados contém arquivos que incluem ObjectId no nome do arquivo:

accountingArchive
|--invoices
|--507f1f77bcf86cd799439011.json
|--507f1f77bcf86cd799439012.json
|--507f1f77bcf86cd799439013.json
|--507f1f77bcf86cd799439014.json
|--507f1f77bcf86cd799439015.json

O seguinte objeto databases cria partições para o ObjectIds.

"databases" : [
{
"name" : "accounting",
"collections" : [
{
"name" : "invoices",
"dataSources" : [
{
"storeName" : "accountingArchive",
"path" : "/invoices/{objid objectid}"
}
]
}
]
}
]

Ou suponha que o armazenamento da instância do banco de dados federado accountingArchive contenha arquivos que incluam uma faixa de ObjectIds no nome do arquivo. Por exemplo:

accountingArchive
|--invoices
|--507f1f77bcf86cd799439011-507f1f77bcf86cd799439020.json
|--507f1f77bcf86cd799439021-507f1f77bcf86cd799439030.json
|--507f1f77bcf86cd799439031-507f1f77bcf86cd799439040.json

O seguinte objeto databases cria partições para o intervalo fornecido de ObjectIds.

"databases" : [
{
"name" : "accounting",
"collections" : [
{
"name" : "invoices",
"dataSources" : [
{
"storeName" : "accountingArchive",
"path" : "/invoices/{min(obj) objectid}-{max(obj) objectid}"
}
]
}
]
}
]

Quando o Data Federation recebe uma query no ObjectId, ele usa o caminho especificado para identificar qual arquivo contém os dados que correspondem à query.

Você pode especificar funções de análise em qualquer caminho que leve até o nome do arquivo. Cada campo calculado é baseado em uma função de análise ao longo do caminho. Ao executar query dos dados, o Atlas Data Federation converte cada campo computado em uma partição. As partições, que são sinônimos de subdiretórios, são usadas para filtrar arquivos com precisão crescente.

Considere uma instância do banco de dados federado accountingArchive com a seguinte estrutura de diretório:

invoices
|--MONGO12345
|--2019
|--01
|--02

O seguinte objeto databases cria as partições invoiceNumber, year, month e day com um pequeno conjunto de arquivos filtrados:

"databases" : [
{
"name" : "accounting",
"collections" : [
{
"name" : "invoices",
"dataSources" : [
{
"storeName" : "accountingArchive",
"path" : "/invoices/{invoiceNumber string}/{year int}/{month int:\\d{2}}/{day int:\\d{2}}/*"
}
]
}
]
}
}

Você pode especificar ISODate no caminho para os arquivos. Para arquivos que contêm ISODate no nome do arquivo, o Atlas Data Federation cria partições para cada ISODate.

Consider the following federated database instance store, accountingArchive. Este armazenamento de dados contém arquivos que incluem ISODate no nome do arquivo:

accountingArchive
|--invoices
|--01_02_2022_2301.json
|--02_02_2022_2301.json
|--03_02_2022_2301.json
|--04_02_2022_2301.json
|--05_02_2022_2301.json

O seguinte objeto databases cria partições para o ISODate. O path demonstra como usar regex para o formato de data se a data não estiver em RFC 3339 formato.

"databases" : [
{
"name" : "accounting",
"collections" : [
{
"name" : "invoices",
"dataSources" : [
{
"storeName" : "accountingArchive",
"path" : "/invoices/creationDate isodate('01_02_2006_1504'):\\d{2}_\\d{2}_\\d{4}_\\d{4}.json"
}
]
}
]
}
]

Para saber mais sobre outros formatos suportados, consulte Usar tipos de atributo de partição.

Considere uma instância do banco de dados federado accountingArchive com a seguinte estrutura de diretório:

invoices
|--SuperSoftware
|--UltraSoftware
|--MegaSoftware

O seguinte objeto databases gera um nome de coleção dinâmico a partir do caminho do arquivo:

"databases" : [
{
"name" : "invoices",
"collections" : [
{
"name" : "*",
"dataSources" : [
{
"storeName" : "accountingArchive",
"path" : "/invoices/{collectionName()}/"
}
]
}
]
}
]

Quando aplicado à estrutura de diretórios de exemplo, o caminho resulta nas seguintes collections:

  • Supersoftware

  • ultrasoftware

  • megasoftware

Ou considere um instância do banco de dados federado accountingArchive com os seguintes arquivos:

/orders/MONGODB/invoices/January.json
/orders/MONGODB/purchaseOrders/January.json
/orders/MONGODB/invoices/February.json
...

O seguinte objeto databases gera um nome de coleção dinâmico a partir do caminho do arquivo:

"databases" : [
{
"name" : "invoices",
"collections" : [
{
"name" : "*",
"dataSources" : [
{
"storeName" : "accountingArchive",
"path" : "/orders/MONGODB/{collectionName()}/{invoiceMonth string}.json/"
}
]
}
]
}
]

Quando aplicado aos nomes de arquivo de exemplo, o caminho resulta nas seguintes coleções:

  • invoices

  • purchaseOrders

Observação

Quando você gera collection dinamicamente a partir de nomes de arquivos, o número de collection não é relatado com precisão na visualização Data Federation .

Voltar

Gerar collections