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
Visão geral
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
.
Funções de análise suportadas
Você pode especificar uma única função de análise no nome do arquivo. |
| |
Você pode especificar múltiplas funções de análise no nome do arquivo. |
| |
Você pode especificar funções de análise junto com strings estáticas no nome do arquivo: |
| |
Você pode especificar um ponto (ou seja, |
| |
Você pode especificar |
| |
Você pode especificar um intervalo de |
| |
Você pode especificar funções de análise ao longo do caminho para o nome do arquivo. |
| |
Você pode especificar regex para |
|
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:
Adicione um separador constante entre os atributos.
Use expressões regulares para descrever o padrão de pesquisa. Para saber mais, consulte Funções de análise não permitidas.
Analisando valores nulos de nomes de arquivos
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.
Analisando números preenchidos de nomes de arquivos
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}}
Funções de análise não suportadas
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 esecond
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 esecond
a 5 letras minúsculas.
Exemplos
Os exemplos a seguir demonstram como analisar nomes de arquivos em campos calculados:
Usar Expressão Regular para Analisar Campos do Nome do Arquivo
Identifique intervalos de dados consultáveis a partir do nome do arquivo
Gerar nomes de coleção dinâmicos a partir do caminho do arquivo
Analisar Campo Único do Nome do Arquivo
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.
Analisar vários campos do nome do arquivo
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.
Usar Expressão Regular para Analisar Campos do Nome do Arquivo
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 stringUm 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 double , você deverá trocar esses valores. A Data Federation 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.
Identifique intervalos de dados consultáveis a partir do nome do arquivo
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 documento 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.
Identificar campos aninhados a partir do nome do arquivo
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, .
) no seu path
para mapear os atributos das partições na sua configuração de armazenamento para campos aninhados nos 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.
Criar partições a partir de ObjectIds
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.
Criar partições a partir do caminho do arquivo
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}}/*" } ] } ] } }
Criar partições a partir do ISODate
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.
Gerar nomes de coleção dinâmicos a partir do caminho do arquivo
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 .