$setDifference (Diferença de Conjuntos)
Última atualização: 2026-10-09
$setDifference (Diferença de Conjuntos)
$setDifference retorna os elementos presentes no primeiro array e ausentes no segundo, com duplicatas removidas. Usos típicos: encontrar produtos que um usuário comprou mas não favoritou, ou fazer o diff de duas listas de nomes. Ambos os argumentos devem ser arrays, e elementos null são ignorados. O resultado não tem ordem garantida, e as posições relativas após a deduplicação não são preservadas. Operadores de conjunto tratam arrays como conjuntos, formando uma família com $setIntersection e $setUnion.
| Categoria | Conjunto, Condição e Conversão |
|---|---|
| Versão do MongoDB | 1.0+ |
| Idioma do Exemplo | mongosh (Shell) |
📝 Sintaxe
{ $setDifference: [ <arrayA>, <arrayB> ] }
⚙️ Parâmetros
| array A | O conjunto do qual subtrair. |
|---|---|
| array B | O conjunto a subtrair. |
Retorno:Uma matriz (sem duplicatas) de elementos em A mas não em B; null quando qualquer argumento é null
▶ Exemplo
Execute os comandos abaixo no seu mongosh local (requer um mongod em execução):
// $setDifference: comprado mas não favoritado
db.users.aggregate([
{ $project: {
notFav: { $setDifference: ['$bought', '$favorites'] }
} }
])
Saída:
{ '_id': 1, 'notFav': [ 'skuB' ] }
📌 Notas
- O resultado é deduplicado sem ordem garantida; nunca dependa de posições
- Elementos null são ignorados e não afetam o resultado
- Ambos os argumentos devem ser arrays ou o operador gera erro
🏷️ Tags Relacionados
💡 Casos Relacionados
Mais casos práticos em breve.
📚 Tutoriais Relacionados
❓ Perguntas Frequentes
QO resultado é deduplicado?
ASim — sob semântica de conjunto, cada elemento aparece uma vez.
QO resultado mantém a ordem da entrada?
ASem garantia — não dependa da ordem em etapas posteriores.
QComo difere de $filter?
A$filter remove por condição por elemento; $setDifference calcula uma diferença de conjuntos contra outro array.