> ## Documentation Index
> Fetch the complete documentation index at: https://docs.lerian.studio/llms.txt
> Use this file to discover all available pages before exploring further.

# Filtros

> Os dez operadores de filtro do Fetcher, o formato exato de valor que cada um aceita e as regras de validação que rejeitam um filtro malformado.

Filtros restringem as linhas que um job de extração lê. Você os associa por campo, e o Fetcher os converte em uma cláusula `WHERE` num motor relacional ou em um documento de consulta no MongoDB.

## Onde ficam os filtros

***

Os filtros ficam ao lado de `mappedFields` na requisição, em quatro níveis: fonte de dados, depois tabela, depois campo, depois o objeto de operador.

```json theme={null}
{
  "dataRequest": {
    "mappedFields": {
      "my_postgres": { "transactions": ["id", "amount", "status", "created_at"] }
    },
    "filters": {
      "my_postgres": {
        "transactions": {
          "status": { "in": ["completed", "pending"] },
          "amount": { "gt": [100], "lte": [5000] },
          "created_at": { "between": ["2026-06-01", "2026-06-30"] }
        }
      }
    }
  }
}
```

Toda fonte de dados nomeada em `filters` também precisa aparecer em `mappedFields`. O Manager rejeita um filtro que aponta para uma fonte de dados desconhecida.

## Os dez operadores

***

Todo operador recebe um **array JSON**, mesmo quando ele guarda um único valor. O array é o formato. O que muda por operador é a quantidade de elementos.

| Operador  | Formato do valor                      | Resultado                                                                        |
| --------- | ------------------------------------- | -------------------------------------------------------------------------------- |
| `eq`      | Um ou mais valores                    | Um valor casa com `=`. Dois ou mais viram `IN (…)`.                              |
| `gt`      | Exatamente um valor                   | `field > value`                                                                  |
| `gte`     | Exatamente um valor                   | `field >= value`                                                                 |
| `lt`      | Exatamente um valor                   | `field < value`                                                                  |
| `lte`     | Exatamente um valor                   | `field <= value`                                                                 |
| `between` | Exatamente dois valores, `[min, max]` | `field >= min AND field <= max`, inclusivo nas duas pontas.                      |
| `in`      | Um ou mais valores                    | `field IN (…)`                                                                   |
| `nin`     | Um ou mais valores                    | `field NOT IN (…)`                                                               |
| `ne`      | Um ou mais valores                    | Um valor gera `field <> value`. Cada valor extra acrescenta outra condição `<>`. |
| `like`    | Um padrão de texto                    | `field LIKE pattern`, com os curingas SQL `%` e `_`.                             |

Exemplos de cada formato:

```json theme={null}
{
  "status":      { "eq": ["active", "pending"] },
  "amount":      { "gt": [100] },
  "created_at":  { "gte": ["2026-06-01"] },
  "total":       { "lt": [1000] },
  "closed_at":   { "lte": ["2026-06-30"] },
  "value":       { "between": [100, 1000] },
  "state":       { "in": ["active", "pending", "suspended"] },
  "state_two":   { "nin": ["deleted", "archived"] },
  "kind":        { "ne": ["internal"] },
  "description": { "like": ["%refund%"] }
}
```

## Como os operadores se combinam

***

Você pode colocar vários operadores no mesmo campo. O Fetcher combina todos eles com `AND`. O exemplo `{ "gt": [100], "lte": [5000] }` se lê como `amount > 100 AND amount <= 5000`.

Filtros em campos diferentes também se combinam com `AND`. Não existe `OR` entre campos. Use `in` quando você precisar de `OR` sobre os valores de um mesmo campo.

## Regras de validação

***

O Fetcher rejeita um filtro antes de montar a consulta quando o formato do valor está errado:

* `between` com uma quantidade diferente de dois falha com `between operator for field 'X' must have exactly 2 values, got N`.
* `gt`, `gte`, `lt` e `lte` com uma quantidade diferente de um falham com a mensagem correspondente a cada operador.

Os demais operadores usam o formato que a tabela define:

* `like` recebe exatamente um padrão de texto.
* `eq`, `in`, `nin` e `ne` recebem um ou mais valores.

## Campos que parecem identificadores

***

Nos motores relacionais, o Fetcher inspeciona o nome do campo. Um nome que contém `id`, `_id`, `uuid`, `template_id`, `organization_id`, `user_id` ou `account_id` é tratado como campo UUID.

Todo valor de texto sob `eq`, `gt`, `gte`, `lt`, `lte`, `between`, `in` e `nin` precisa então ser um UUID válido. Um valor que não converte faz a requisição falhar e nomeia o campo.

Dois operadores ficam fora dessa verificação: `ne` e `like`. O MongoDB não executa essa verificação.

## Datas em um filtro between

***

Nos motores relacionais, o Fetcher estende o limite superior de um filtro `between` até o fim do dia quando três condições valem ao mesmo tempo:

1. O nome do campo parece de data. Ele contém `date`, `time`, `_at`, `created_at`, `updated_at`, `deleted_at` ou `completed_at`.
2. Os dois limites parecem textos de data.
3. O limite superior tem exatamente dez caracteres, na forma `YYYY-MM-DD`.

O Fetcher então reescreve o limite superior para `YYYY-MM-DDT23:59:59.999Z`. Um filtro `["2026-06-01", "2026-06-30"]` portanto inclui o dia 30 de junho inteiro.

No MongoDB, os dois limites valem exatamente como você os escreve. Para cobrir um dia inteiro ali, escreva o limite superior como um timestamp completo: `["2026-06-01", "2026-06-30T23:59:59.999Z"]`.

## Filtros no MongoDB

***

O MongoDB aceita os mesmos dez operadores, e o Fetcher os traduz para operadores de consulta:

| Operador                 | Forma no MongoDB             |
| ------------------------ | ---------------------------- |
| `eq` com um valor        | `{ "field": value }`         |
| `eq` com dois ou mais    | `$in`                        |
| `gt`, `gte`, `lt`, `lte` | `$gt`, `$gte`, `$lt`, `$lte` |
| `between`                | `$gte` e `$lte`              |
| `in`                     | `$in`                        |
| `nin`                    | `$nin`                       |
| `ne` com um valor        | `$ne`                        |
| `ne` com dois ou mais    | `$nin`                       |
| `like`                   | `$regex` com a opção `i`     |

O padrão de `like` vira uma expressão regular: `%` vira `.*`, e `_` vira `.`. O Fetcher ancora o padrão no início, a menos que ele comece com `%`, e no fim, a menos que ele termine com `%`. A opção `i` torna a correspondência insensível a maiúsculas e minúsculas.

## Correspondência da chave da tabela

***

A chave de tabela em `filters` precisa encontrar sua tabela em `mappedFields`. PostgreSQL e SQL Server aceitam três formas da chave: o nome exato da tabela, o nome sem o prefixo de esquema e o nome com o esquema padrão acrescentado. Um filtro com a chave `transactions` portanto ainda se aplica à tabela `public.transactions`.

MySQL, Oracle e MongoDB fazem a correspondência exata da chave. Escreva a chave exatamente como você escreveu o nome da tabela ou da coleção em `mappedFields`.

## Próximos passos

***

<CardGroup cols={2}>
  <Card title="Jobs de extração" icon="list-check" href="/pt/fetcher/fetcher-extraction-jobs">
    A requisição completa do job e o caminho da criação até o resultado armazenado.
  </Card>

  <Card title="Fontes de dados" icon="database" href="/pt/fetcher/fetcher-datasources">
    O que se comporta de forma diferente em cada um dos cinco motores de banco de dados.
  </Card>
</CardGroup>
