$nin$ninselecciona los documentos donde:el valor del campo especificado no se encuentra en el arreglo especificado o
el campo especificado no existe.
Compatibilidad
Puedes usar $nin para implementaciones alojadas en los siguientes entornos:
MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube
MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB
MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.
Sintaxis
El operador $nin tiene la siguiente forma:
{ field: { $nin: [ <value1>, <value2> ... <valueN> ] } }
Si field tiene un arreglo, el operador $nin selecciona los documentos cuyo field tiene un arreglo sin ningún elemento igual a un valor en el arreglo especificado. Por ejemplo, <value1>, <value2>, y así sucesivamente.
Para la comparación de diferentes valores de tipo BSON, consulta el orden de comparación especificado de BSON.
Ejemplos
Los ejemplos de esta página utilizan datos del conjunto de datos de muestra sample_mflix. Para obtener más información sobre cómo cargar este conjunto de datos en la implementación autogestionada de MongoDB, consultar Cargar el conjunto de datos de muestra. Si se realizó alguna modificación en las bases de datos de muestra, es posible que se deban descartar y volver a crear las bases de datos para ejecutar los ejemplos de esta página.
Selecciona sobre documentos no coincidentes
El siguiente ejemplo devuelve películas en las que runtime es mayor que 1000 minutos y rated no está en [ "G", "PG" ]. Debido a que $nin también coincide con documentos que no contienen el campo rated, la query devuelve las películas incluso cuando los datos de calificación no están disponibles:
db.movies.find( { rated: { $nin: [ "G", "PG" ] }, runtime: { $gt: 1000 } }, { _id: 0, title: 1, year: 1, rated: 1 } )
[ { title: 'Centennial', year: 1978 }, { title: 'Baseball', year: 1994, rated: 'TV-PG' } ]
Selecciona sobre elementos que no están en un arreglo
El siguiente ejemplo configura el campo exclude en true para las películas que no tengan "Drama" en su arreglo genres:
db.movies.updateMany( { genres: { $nin: [ "Drama" ] } }, { $set: { exclude: true } } )
{ acknowledged: true, insertedId: null, matchedCount: ..., modifiedCount: ..., upsertedCount: 0 }
updateMany() también selecciona un documento cuando el documento no contiene el campo $nin con el que se está haciendo la coincidencia.
El operador de desigualdad $nin no es muy selectivo, ya que a menudo coincide con una gran parte del índice. Como resultado, en muchos casos, puede que un query $nin con un índice no tenga un mejor rendimiento que un query $nin que debe escanear todos los documentos de una colección. Consulta también Crear queries selectivos.