Precisando encontrar registros duplicados no seu banco de dados MongoDB? Nesse artigo explicarei como encontrar os documentos (registros) duplicados utilizando o método aggregate.
O banco de dados
Vamos supor que fizemos uma carga massiva de dados de uma lista de usuários e queremos descobrir quantos registros duplicados existem com o mesmo CPF.
Utilizaremos como exemplo a seguinte estrutura de documentos:
db.list.findOne();
{
"_id" : ObjectId("8902a01b2ec12a2383328b61"),
"nome" : "Henrique Marques Fernandes",
"site": "https://marquesfernandes.com",
"cidade" : "SP",
"cpf": "182.983.460-68"
}
Encontrando dados duplicados com aggregate
Para isso utilizaremos o método aggregate com os operadores $group e $match para agrupar e filtrar nosso resultado, usando como identificador único o campo CPF e adicionaremos dois novos campos: O campo “idsUnicos” contendo todos os ids únicos duplicados encontrados e o campo “total” somando o total de documentos duplicados encontrados por CPF:
db.list.aggregate([
{$group: {
_id: {cpf: "$cpf"},
idsUnicos: {$addToSet: "$_id"},
total: {$sum: 1}
}
}
]);
A query acima retornará uma lista com todos os CPFs e as respectivas contagens. Agora para encontrar e retornar apenas os CPFs com um ou mais registros duplicados devemos adicionar o operador $match para filtrar apenas as consultas com mais de um registro no campo total:
db.list.aggregate([
{$group: {
_id: {cpf: "$cpf"},
idsUnicos: {$addToSet: "$_id"},
total: {$sum: 1}
}
},
{$match: {
total: {"$gt": 1}
}
}
]);