Definición
Devuelve una matriz con todos los valores únicos de una ventana específica.
El orden de los elementos en el arreglo devuelto es indefinido.
Nota
Desambiguación
Esta página describe $addToSet cuando se utiliza como función de ventana.
También puedes usar $addToSet en estos otros contextos:
$addToSet (accumulator), que devuelve un único valor agregado basado en un número variable de documentos de entrada.$addToSet (update operator), que agrega elementos a un campo de matriz en un documento.
Sintaxis
{ $setWindowFields: { ... output: { <field>: { $addToSet: <expression> } } } }
Comportamiento
Si el valor de la expresión es una matriz, $addToSet agrega toda la matriz como un solo elemento.
Si el valor de la expresión es un documento, MongoDB determina que el documento es un duplicado si otro documento del arreglo coincide exactamente con el documento que se va a agregar. En concreto, el documento existente tiene exactamente los mismos campos y valores en el mismo orden.
Ejemplo
Los ejemplos de esta página utilizan datos del conjunto de datos sample_mflix. Para obtener más información sobre cómo cargar este conjunto de datos en su implementación autogestionada de MongoDB, consulte Cargar el conjunto de datos de ejemplo. Si realizó alguna modificación en las bases de datos de ejemplo, es posible que deba eliminarlas y volver a crearlas para ejecutar los ejemplos de esta página.
Este ejemplo utiliza la función de ventana $addToSet para mostrar cómo se acumulan los géneros únicos en las películas a lo largo del tiempo. Las películas se ordenan alfabéticamente por título, y la función de ventana registra todos los géneros únicos que han aparecido en las películas desde el inicio de la configuración de resultados hasta la película actual, inclusive.
db.movies.aggregate( [ { $match: { year: 2002, genres: { $exists: true, $ne: [] } } }, { $group: { _id: { year: "$year", title: "$title", genre: { $first: "$genres" } }, } }, { $setWindowFields: { sortBy: { "_id.title": 1 }, output: { genresSeenSoFar: { $addToSet: "$_id.genre", window: { documents: [ "unbounded", "current" ] } } } } }, { $project: { _id: 0, year: "$_id.year", title: "$_id.title", genre: "$_id.genre", genresSeenSoFar: 1, uniqueGenreCount: { $size: "$genresSeenSoFar" } } }, { $limit: 8 } ] )
En el ejemplo:
La etapa
$matchfiltra las películas de 2002 con información de género.Los grupos de la etapa
$groupse ordenan por año, título y el primer género en la matrizgenres.La etapa
$setWindowFieldsutiliza$addToSetcon una ventana deunboundedacurrentpara acumular géneros únicos desde el inicio del conjunto de resultados hasta el documento actual.La etapa
$projectremodela la salida y calculauniqueGenreCountpara mostrar cómo crece el tamaño del conjunto.
El resultado demuestra cómo $addToSet acumula géneros únicos en los documentos. Observe que genresSeenSoFar pasa del género 1 al género 7 a medida que cada película añade su género al conjunto. El séptimo documento ('3 Extremes II') tiene el mismo uniqueGenreCount que el sexto porque su género (Terror) ya estaba en el conjunto. Esto demuestra que $addToSet solo añade valores únicos e ignora los duplicados.