MongoDB – Outras operações de Aggregation

Operadores de mongoDB essenciais

Depois de uma breve introdução ao operador aggregation, vamos ver outros operadores essenciais para utilizar os pipelines. Sem eles não faz sentido usar o aggregation do MongoDB!

Introdução aos operadores $sort, $project, $addFields, $limit, $skip e $group.

Nesse artigo vou dar uma introdução aos operadores $sort, $project, $addFields, $limit, $skip e $group.

Dado o seguinte exemplo de entrada de uma coleção de alunos de uma escola, para cada um dos operadores:

[{
  "_id": {
    "$oid": "63c5b2a9c8f4d4972b847a45"
  },
  "nome": "João da Silva",
  "idade": 12,
  "cidade": "São Paulo"
},{
  "_id": {
    "$oid": "63c5b2dac8f4d4972b847a46"
  },
  "nome": "Maria Souza",
  "idade": 13,
  "cidade": "São Paulo"
},{
  "_id": {
    "$oid": "63c5b330c8f4d4972b847a47"
  },
  "nome": "Enzo Lorenzo",
  "idade": 11,
  "cidade": "Guarulhos"
}]

$sort

O operador $sort irá ordenar os documentos que entraram nesse estágio pelo campo especificado, em ordem crescente (1) ou decrecente (-1).

{
  $sort: {
    'nome': 1
  }
}
Saída com os documentos ordenados de forma decrescente pelo campo nome:
[{
  "_id": {
    "$oid": "63c5b330c8f4d4972b847a47"
  },
  "nome": "Enzo Lorenzo",
  "idade": 11,
  "cidade": "Guarulhos"
},{
  "_id": {
    "$oid": "63c5b2a9c8f4d4972b847a45"
  },
  "nome": "João da Silva",
  "idade": 12,
  "cidade": "São Paulo"
},{
  "_id": {
    "$oid": "63c5b2dac8f4d4972b847a46"
  },
  "nome": "Maria Souza",
  "idade": 13,
  "cidade": "São Paulo"
}]

$project

O operador $project repassa alguns dos campos do documento de entrada para o documento de saída conforme a definição e pode passar adiante novos campos. Também pode ser utilizado para esconder um campo (0).

{
  $project: {
    '_id': 0,
    'cidade': 1,
    'nome': 1,
  }
}
Saída com apenas alguns campos projetados, escondendo o campo _id:
[{
  "nome": "Enzo Lorenzo",
  "cidade": "Guarulhos"
},{
  "nome": "João da Silva",
  "cidade": "São Paulo"
},{
  "nome": "Maria Souza",
  "cidade": "São Paulo"
}]

$addFields

O operador $addFields adiciona novos campos no documento de saída. É parecido com o $project, porém ele sempre irá manter todos os campos que já estão no documento de entrada. Vale notar que os documentos originais da coleção nunca são atualizados durante um pipeline, os campos adicionados só existirão em tempo de execução.
Podemos adicionar uma referência a um outro campo, com um $nome-do-campo.

{
  $addFields: {
    'escola': 'SENAI',
    'nome_2': "$nome"
  }
}
Saída, documentos com o campo adicional escola e o nome_2:
[{
  "_id": {
    "$oid": "63c5b2a9c8f4d4972b847a45"
  },
  "nome": "João da Silva",
  "idade": 12,
  "cidade": "São Paulo",
  "escola": "SENAI",
  "nome_2": "João da Silva"
},{
  "_id": {
    "$oid": "63c5b2dac8f4d4972b847a46"
  },
  "nome": "Maria Souza",
  "idade": 13,
  "cidade": "São Paulo",
  "escola": "SENAI",
  "nome_2": "Maria Souza"
},{
  "_id": {
    "$oid": "63c5b330c8f4d4972b847a47"
  },
  "nome": "Enzo Lorenzo",
  "idade": 11,
  "cidade": "Guarulhos",
  "escola": "SENAI",
  "nome_2": "Enzo Lorenzo"
}]

$limit e $skip

O operador $limit irá definir o número máximo de documentos na saída, e o $skip irá definir uma quantidade de documentos da saída que serão ignorados. O próximo documento da sequência será o primeiro no resultado.
Esses operadores podem ser utilizados indidualmente, mas podemos utilizar esses operadores em conjunto para montar uma paginação nos resultados da aggregation. Por exemplo, se quisermos consultar a terceira página com 10 registros por página, definimos um limit de 10 registros por página com um skip de 20.

{
  $skip: 1
}
{
  $limit: 1
}
Saída pulando o primeiro documento (nome João) e limitado a apenas 1 documento:
[{
  "_id": {
    "$oid": "63c5b2dac8f4d4972b847a46"
  },
  "nome": "Maria Souza",
  "idade": 13,
  "cidade": "São Paulo"
}]

$group

O operador group geralmente é o último operador em um pipeline, utilizado quando queremos agrupar os documentos utilizando uma das propriedades dos documentos, que seria a chave do agrupamento (campo “id” dentro do $group).
Podemos definir alguns operadores acumuladores, que irão trazer alguns dados sobre os grupos formados, como $count, $avg, $sum.
O operador $push irá montar uma array com os documentos agrupados em um novo campo.

{
  $group: {
    _id : "$cidade",
    alunos: { 
      $push: "$$ROOT"
    },
    count: { 
      $sum: 1
    }
  }
}
Saída agrupando os dados pelo campo cidade, o campo alunos com os documentos agrupados e o count totalizando o total de cada grupo:
[{
  "_id": "Guarulhos",
  "alunos": [
    {
      "_id": {
        "$oid": "63c5b330c8f4d4972b847a47"
      },
      "nome": "Enzo Lorenzo",
      "idade": 11,
      "cidade": "Guarulhos"
    }
  ],
  "count": 1
},{
  "_id": "São Paulo",
  "alunos": [
    {
      "_id": {
        "$oid": "63c5b2a9c8f4d4972b847a45"
      },
      "nome": "João da Silva",
      "idade": 12,
      "cidade": "São Paulo"
    },
    {
      "_id": {
        "$oid": "63c5b2dac8f4d4972b847a46"
      },
      "nome": "Maria Souza",
      "idade": 13,
      "cidade": "São Paulo"
    }
  ],
  "count": 2
}]
Sobre Danilo Uema 4 Artigos
Desenvolvedor de sistemas senior Full Stack com conhecimentos em C#, TypeScript, SQL, NoSQL

Seja o primeiro a comentar

Faça um comentário

Seu e-mail não será divulgado.


*