# MongoDB

O **MongoDB** realiza operações em uma conexão com um banco de dados Mongo, retornando apenas um objeto JSON.

{% hint style="info" %}
Atenção ao consumo de memória para grandes conjuntos de dados.
{% endhint %}

## **Parâmetros**

Dê uma olhada nos parâmetros de configuração do conector. Parâmetros suportados por [expressões Double Braces](https://docs.digibee.com/documentation/connectors-and-triggers/pt-br/double-braces/overview) estão marcados com `(DB)`.

### **Aba General**

<table data-full-width="true"><thead><tr><th>Parâmetro</th><th>Descrição</th><th>Valor padrão</th><th>Tipo de dado</th></tr></thead><tbody><tr><td><strong>Account</strong></td><td>Conta a ser utilizada pelo conector. Contas suportadas: <strong>Basic</strong> e <strong>Certificate Chain</strong>.</td><td>N/A</td><td>String</td></tr><tr><td><strong>Use SSL/TLS to connect</strong></td><td>Quando ativado, será utilizada uma conexão segura SSL/TLS.</td><td>False</td><td>Boolean</td></tr><tr><td><strong>Custom SSL/TLS certificate</strong></td><td>Define o certificado personalizado que pode ser utilizado em expressões Double Braces para a conexão segura.</td><td>N/A</td><td>String</td></tr><tr><td><strong>Allow invalid hostnames</strong></td><td>Quando ativado, essa opção ignora a validação de nomes de host nos certificados SSL/TLS.</td><td>False</td><td>Boolean</td></tr><tr><td><strong>Operation</strong></td><td>Operação a ser executada (<strong>Find, Aggregate</strong>, <strong>Delete One</strong>, <strong>Delete Many</strong>, <strong>Insert One</strong>, <strong>Insert Many</strong>, <strong>Update One</strong>, <strong>Update Many</strong>, <strong>Replace One</strong>, <strong>List Indexes</strong>, <strong>Create Index</strong> e <strong>Drop Index</strong>).</td><td>Find</td><td>String</td></tr><tr><td><strong>Connection String</strong></td><td>A string de conexão. Este parâmetro recupera <code>globals</code> e <code>capsules</code> utilizando a expressão Double Braces, mas não recupera os objetos <code>message</code> ou <code>metadata</code>.</td><td><code>mongodb://localhost:27017</code></td><td>String</td></tr><tr><td><strong>Database Name</strong></td><td>Nome do banco de dados.</td><td><code>databaseName</code></td><td>String</td></tr><tr><td><strong>Collection Name</strong></td><td>Nome da coleção.</td><td><code>collectionName</code></td><td>String</td></tr><tr><td><strong>Expire after seconds</strong></td><td>Tempo (em segundos) para expiração dos documentos ao usar um índice TTL. Disponível apenas se a operação <strong>Create Index</strong> for selecionada.</td><td>0</td><td>Integer</td></tr><tr><td><strong>Query</strong> <code>(DB)</code></td><td>Especificação do Mongo a ser utilizada. Exemplo: <code>{ _id: ObjectId( {{ message.$.id }} ) }</code></td><td>N/A</td><td>String</td></tr><tr><td><strong>Document</strong></td><td>Disponível apenas se <strong>Insert One</strong>, <strong>Insert Many</strong>, <strong>Update One</strong>, <strong>Update Many</strong> ou <strong>Replace One</strong> forem selecionados.</td><td>N/A</td><td>String</td></tr><tr><td><strong>Limit</strong> <code>(DB)</code></td><td>Especificação do número máximo de objetos que podem ser retornados.</td><td>0</td><td>Integer</td></tr><tr><td><strong>Skip</strong> <code>(DB)</code></td><td>Número de objetos a serem ignorados antes da consulta.</td><td>0</td><td>Integer</td></tr><tr><td><strong>Sort</strong></td><td>Especificação do parâmetro de ordenação pelo campo.</td><td>N/A</td><td>String</td></tr><tr><td><strong>Fail On Error</strong></td><td>Se ativado, a execução do pipeline sermongá interrompida em caso de erro. Caso contrário, a execução continuará, mas o resultado indicará um valor falso para a propriedade <code>"success"</code>.</td><td>False</td><td>Boolean</td></tr><tr><td><strong>Max Wait For Connection (in ms)</strong></td><td>Valor padrão: 10000 (pode ser alterado).</td><td>10000</td><td>Integer</td></tr><tr><td><strong>Connection Timeout (in ms)</strong></td><td>Valor padrão: 30000 (pode ser alterado).</td><td>30000</td><td>Integer</td></tr><tr><td><strong>Socket Timeout (in ms)</strong></td><td>Valor padrão: 30000 (pode ser alterado).</td><td>300000</td><td>Integer</td></tr><tr><td><strong>Heartbeat Connection Timeout (in ms)</strong></td><td>Valor padrão: 10000 (pode ser alterado).</td><td>10000</td><td>Integer</td></tr><tr><td><strong>Max Connection Idle Timeout (in ms)</strong></td><td>Valor padrão: 1800000.</td><td>1800000</td><td>Integer</td></tr></tbody></table>

### **Aba Documentation**

<table data-full-width="true"><thead><tr><th>Parâmetro</th><th>Descrição</th><th>Valor padrão</th><th>Tipo de dado</th></tr></thead><tbody><tr><td><strong>Documentation</strong></td><td>Seção para documentar qualquer informação necessária sobre a configuração do conector e regras de negócio.</td><td>N/A</td><td>String</td></tr></tbody></table>

{% hint style="info" %}
Atualmente, o conector suporta apenas contas Basic e Certificate Chain, e elas devem ser informadas no campo Account, não diretamente na string de conexão.
{% endhint %}

Você pode:

* Usar um JSON fixo: `document = "{\"data\": [{\"object\": 1}, {\"object\": 2}]}"`
* Obter um JSON da mensagem, que buscará o objeto `'data'` da mensagem: `document = "{{ message.$.data }}`
* Combinar os dois exemplos: `document = "{\"data\": [{\"object\": {{ message.$.id1 }}}, {\"object\": {{ message.$.id2 }}}]}"`

Se o MongoDB exigir autenticação, é necessário criar uma conta do tipo BASIC e usá-la no conector.

Para converter Double Braces, utilizamos especificações JSON Path. [Leia a documentação sobre JSON Path no GitHub](https://github.com/json-path/JsonPath).

## **MongoDB em ação**

<details>

<summary><strong>Operação Find</strong></summary>

**Config**

```json
{
	"operation": "FIND",
	"databaseName": "test",
	"collectionName": "model",
	"url": "mongodb://localhost:27017",
	"query": "{_id: ObjectId({{ message.$.parameters.id }})}",
	"failOnError": false
}
```

**Entrada**

```json
{
	"parameters": {
		"id": "5c87c7af06c3af7dbedc7bb3"
	}
}
```

**Saída**

```json
{
	"data": [...some data...],
	"rowCount": 10,
	"updateCount": 0
}
```

</details>

<details>

<summary><strong>Operação Replace One</strong></summary>

**Config**

```json
{
	"operation": "REPLACE_ONE",
	"databaseName": "test",
	"collectionName": "model",
	"document": "{\"data\": [{\"object\": 1}, {\"object\": 2}]}",
	"url": "mongodb://localhost:27017",
	"query": "{_id: ObjectId({{ message.$.parameters.id }})}",
	"failOnError": false
}
```

**Entrada**

```json
{
	"parameters": {
		"id": "5c87c7af06c3af7dbedc7bb3"
	}
}
```

**Output**

```json
{
    "data": {},
    "rowCount": 0,
    "updateCount": 1
}
```

</details>

<details>

<summary><strong>Operação Update</strong></summary>

**Config**

```json
{
	"operation": "UPDATE",
	"databaseName": "test",
	"collectionName": "model",
	"document": "{\"$set\": {\"data\": [{\"object\": 1}, {\"object\": 2}]}}",
	"url": "mongodb://localhost:27017",
	"query": "{_id: ObjectId({{ message.$.parameters.id }})}",
	"failOnError": false
}	
```

**Entrada**

```json
{
	"parameters": {
		"id": "5c87c7af06c3af7dbedc7bb3"
	}
}
```

**Output**

```json
{
	"data": {},
	"rowCount": 0,
	"updateCount": 1
}
```

</details>

<details>

<summary><strong>Operação Update Many</strong></summary>

**Config**

```json
{
	"operation": "UPDATE_MANY",
	"databaseName": "test",
	"collectionName": "model",
	"document": "{\"$set\": {\"data\": [{\"object\": 1}, {\"object\": 2}]}}",
	"url": "mongodb://localhost:27017",
	"query": "{name: ObjectId({{ message.$.parameters.name }})}",
	"failOnError": false
}
```

**Entrada**

```json
{
	"parameters": {
		"name": "NAME"
	}
}
```

**Output**

```json
{{
	"data": {},
	"rowCount": 0,
	"updateCount": 1
}  
```

</details>

<details>

<summary><strong>Operação Delete</strong></summary>

**Config**

```json
{
	"operation": "DELETE",
	"databaseName": "test",
	"collectionName": "model",
	"url": "mongodb://localhost:27017",
	"query": "{_id: ObjectId({{ message.$.parameters.id }})}",
	"failOnError": false
}
```

**Entrada**

```json
{
	"parameters": {
		"id": "5c87c7af06c3af7dbedc7bb3"
	}
}
```

**Output**

```json
{
	"data": {},
	"rowCount": 10,
	"updateCount": 0
}
```

</details>

<details>

<summary><strong>Operação Delete Many</strong></summary>

**Config**

```json
{
	"operation": "DELETE_MANY",
	"databaseName": "test",
	"collectionName": "model",
	"url": "mongodb://localhost:27017",
	"query": "{name: {{ message.$.data.name }}}",
	"failOnError": false
}
```

**Entrada**

```json
{
	"data": {
		"name": "NAME"
	}
}
```

**Saída**

```json
{
	"data": {},
	"rowCount": 10,
	"updateCount": 0
}
```

</details>

<details>

<summary><strong>Operação Insert</strong></summary>

**Config**

```json
{
	"operation": "INSERT",
	"databaseName": "test",
	"collectionName": "model",
	"document": "{\"data\": {{ message.$.body }}}",
	"url": "mongodb://localhost:27017",
	"failOnError": false
}
```

**Entrada**

```json
{
	"parameters": {
		"id": "5c87c7af06c3af7dbedc7bb3"
	},
	"body": [
		{"a": 1},
		{"a": 2}
	]
}
```

**Saída**

```json
{
	"data": {},
	"rowCount": 0,
	"updateCount": 1
}
```

</details>

<details>

<summary><strong>Operação Insert Many</strong></summary>

**Config**

```json
{
	"operation": "INSERT_MANY",
	"databaseName": "test",
	"collectionName": "model",
	"document": "{{ message.$.body }}",
	"url": "mongodb://localhost:27017",
	"failOnError": false
}
```

**Entrada**

```json
{
	"parameters": {
		"id": "5c87c7af06c3af7dbedc7bb3"
	},
	"body": [
		{"a": 1},
		{"a": 2}
	]
}
```

**Saída**

```json
{
	"data": {},
	"rowCount": 0,
	"updateCount": 1
}
```

</details>

<details>

<summary><strong>Operação Aggregate</strong></summary>

**Config**

```json
{
	"operation": "AGGREGATE",
	"databaseName": "test",
	"collectionName": "model",
	"url": "mongodb://localhost:27017",
	"query": "[{\"$match\":{\"zip\":\"90210\"}},{\"$group\":{\"_id\":null,\"count\":{\"$sum\":1}}}]",
	"failOnError": false
}
```

**Entrada**

```json
{
	"parameters": {
		"id": "5c87c7af06c3af7dbedc7bb3"
	}
}
```

**Saída**

```json
{
	"data": [...some data...],
	"rowCount": 10,
	"updateCount": 0
}
```

</details>

<details>

<summary><strong>Operação List Indexes</strong></summary>

**Config**

```json
{
	"operation": "LIST_INDEXES",
	"databaseName": "test",
	"collectionName": "model",
	"url": "mongodb://localhost:27017",
	"failOnError": false
}
```

**Entrada**

```json
{ }
```

**Saída**

```json
{
	"data": [...some data...],
	"rowCount": 10
}  
```

</details>

<details>

<summary><strong>Operação Create Index</strong></summary>

**Config**

```json
{
	"operation": "CREATE_INDEX",
	"databaseName": "test",
	"collectionName": "model",
	"url": "mongodb://localhost:27017",
	"expireAfterSeconds": "3600",
	"query": "{ \"createdAt\": 1 }",
	"failOnError": false
}
```

**Entrada**

```json
{ }
```

**Saída**

```json
{
	"data": "createdAt_1",
	"updateCount": 1
}
```

</details>

<details>

<summary><strong>Operação Drop Index</strong></summary>

**Config**

```json
{
	"operation": "DROP_INDEX",
	"databaseName": "test",
	"collectionName": "model",
	"url": "mongodb://localhost:27017",
	"query": "{ \"createdAt\": 1 }",
	"failOnError": false
}
```

**Entrada**

```json
{ }
```

**Saída**

```json
{
	"data": { },
	"updateCount": 1
}
```

</details>
