Definición
Compatibilidad
Puedes usar $filter 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
$filter tiene la siguiente sintaxis:
{ $filter: { input: <array>, as: <string>, arrayIndexAs: <string>, cond: <expression>, limit: <number expression> } }
Campo | Especificación |
|---|---|
| Una expresión que se evalúa en un arreglo. Si Si |
| Opcional. Un nombre para la variable que representa cada elemento individual del arreglo |
| opcional. Un nombre para la variable de agregación que representa el índice del elemento actual en el arreglo Puede usar el nombre de la variable en una expresión. Por ejemplo, si se especifica Si omites Para ejemplos, consulta Accede al índice de cada elemento en un arreglo y Utiliza Nuevo en la versión 8.3. |
| Una expresión que se resuelve en un valor booleano utilizado para determinar si un elemento debe incluirse en el arreglo de salida. La expresión hace referencia a cada elemento del arreglo |
| Opcional. Una expresión numérica que limita la cantidad de elementos coincidentes del arreglo que Si el |
Para obtener más información sobre las expresiones, consulta Expresiones.
Comportamiento
Ejemplo | Resultados | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
| ||||||||
|
| ||||||||
|
|
Ejemplos
Una colección sales tiene los siguientes documentos:
db.sales.insertMany( [ { _id: 0, items: [ { item_id: 43, quantity: 2, price: 10, name: "pen" }, { item_id: 2, quantity: 1, price: 240, name: "briefcase" } ] }, { _id: 1, items: [ { item_id: 23, quantity: 3, price: 110, name: "notebook" }, { item_id: 103, quantity: 4, price: 5, name: "pen" }, { item_id: 38, quantity: 1, price: 300, name: "printer" } ] }, { _id: 2, items: [ { item_id: 4, quantity: 1, price: 23, name: "paper" } ] } ] )
Filtro basado en la comparación de números
El siguiente ejemplo filtra el arreglo items para incluir solo documentos que tengan un price mayor o igual a 100:
db.sales.aggregate( [ { $project: { items: { $filter: { input: "$items", as: "item", cond: { $gte: [ "$$item.price", 100 ] } } } } } ] )
[ { _id: 0, items: [ { item_id: 2, quantity: 1, price: 240, name: 'briefcase' } ] }, { _id: 1, items: [ { item_id: 23, quantity: 3, price: 110, name: 'notebook' }, { item_id: 38, quantity: 1, price: 300, name: 'printer' } ] }, { _id: 2, items: [] } ]
Utiliza el campo límite
Este ejemplo utiliza la colección sales del ejemplo anterior.
El ejemplo utiliza el campo limit para especificar el número de elementos coincidentes devueltos en cada arreglo items.
db.sales.aggregate( [ { $project: { items: { $filter: { input: "$items", as: "item", cond: { $gte: [ "$$item.price", 100 ] }, limit: 1 } } } } ] )
[ { _id: 0, items: [ { item_id: 2, quantity: 1, price: 240, name: 'briefcase' } ] }, { _id: 1, items: [ { item_id: 23, quantity: 3, price: 110, name: 'notebook' } ] }, { _id: 2, items: [] } ]
límite mayor que las coincidencias posibles
Este ejemplo utiliza la colección sales del ejemplo anterior.
El ejemplo utiliza un valor de campo limit que es mayor que el número posible de elementos coincidentes que se pueden devolver. En este caso, limit no afecta los resultados de la query y devuelve todos los documentos que coinciden con los criterios de filtro $gte.
db.sales.aggregate( [ { $project: { items: { $filter: { input: "$items", as: "item", cond: { $gte: [ "$$item.price", 100] }, limit: 5 } } } } ] )
[ { _id: 0, items: [ { item_id: 2, quantity: 1, price: 240, name: 'briefcase' } ] }, { _id: 1, items: [ { item_id: 23, quantity: 3, price: 110, name: 'notebook' }, { item_id: 38, quantity: 1, price: 300, name: 'printer' } ] }, { _id: 2, items: [] } ]
Filtro basado en la coincidencia exacta de String
Este ejemplo utiliza la colección sales del ejemplo anterior.
Los siguientes filtros de agregación para items que tienen un valor de name de pen.
db.sales.aggregate( [ { $project: { items: { $filter: { input: "$items", as: "item", cond: { $eq: [ "$$item.name", "pen"] } } } } } ] )
[ { _id: 0, items: [ { item_id: 43, quantity: 2, price: 10, name: 'pen' } ] }, { _id: 1, items: [ { item_id: 103, quantity: 4, price: 5, name: 'pen' } ] }, { _id: 2, items: [] } ]
Filtro según coincidencia de expresión regular
Este ejemplo utiliza la colección sales del ejemplo anterior.
La siguiente agregación utiliza $regexMatch para filtrar por items que tienen un valor de name que empieza con p:
db.sales.aggregate( [ { $project: { items: { $filter: { input: "$items", as: "item", cond: { $regexMatch: { input: "$$item.name", regex: /^p/ } } } } } } ] )
[ { _id: 0, items: [ { item_id: 43, quantity: 2, price: 10, name: 'pen' } ] }, { _id: 1, items: [ { item_id: 103, quantity: 4, price: 5, name: 'pen' }, { item_id: 38, quantity: 1, price: 300, name: 'printer' } ] }, { _id: 2, items: [ { item_id: 4, quantity: 1, price: 23, name: 'paper' } ] } ]
Accede al índice de cada elemento de un arreglo
Crea una colección de muestra llamada people con estos document:
db.people.insertMany( [ { _id: 1, name: "Melissa", hobbies: [ "softball", "drawing", "reading" ] }, { _id: 2, name: "Brad", hobbies: [ "gaming", "skateboarding" ] }, { _id: 3, name: "Scott", hobbies: [ "basketball", "music", "fishing" ] }, { _id: 4, name: "Tracey", hobbies: [ "acting", "yoga" ] }, { _id: 5, name: "Josh", hobbies: [ "programming" ] }, { _id: 6, name: "Claire" } ] )
El campo hobbies contiene un arreglo con los pasatiempos de cada persona en orden de clasificación. El primer hobby en el arreglo es el hobby principal de la persona al que le dedica más tiempo. El primer pasatiempo tiene un índice de arreglo de 0.
El siguiente ejemplo utiliza arrayIndexAs. La variable myIndex tiene el índice de cada hobby en el arreglo hobbies. El ejemplo devuelve documentos con estos campos:
Nombre de la persona.
secondaryHobbiesarreglo que incluye todos los otros pasatiempos.
db.people.aggregate( [ { $project: { _id: 0, name: 1, secondaryHobbies: { $filter: { input: "$hobbies", arrayIndexAs: "myIndex", cond: { $eq: [ { $mod: [ "$$myIndex", 2 ] }, 0 ] } } } } } ] )
Salida:
[ { "name" : "Melissa", "secondaryHobbies" : [ "softball", "reading" ] } { "name" : "Brad", "secondaryHobbies" : [ "gaming" ] } { "name" : "Scott", "secondaryHobbies" : [ "basketball", "fishing" ] } { "name" : "Tracey", "secondaryHobbies" : [ "acting" ] } { "name" : "Josh", "secondaryHobbies" : [ "programming" ] } { "name" : "Claire", "secondaryHobbies" : null } ]
Use $$IDX para acceder al índice
La $$IDX variable devuelve el índice del elemento actual en el arreglo input. Puede usar $$IDX si omite el campo arrayIndexAs de la expresión.
El siguiente ejemplo devuelve los mismos **documents** que el ejemplo de la sección **anterior** Acceder al **índice** de cada elemento de un **arreglo**, pero utiliza $$IDX en lugar de arrayIndexAs:
db.people.aggregate( [ { $project: { _id: 0, name: 1, secondaryHobbies: { $filter: { input: "$hobbies", cond: { $eq: [ { $mod: [ "$$IDX", 2 ] }, 0 ] } } } } } ] )