Cómo hacer coincidir una cadena dentro de un arreglo embebido o un documento en MongoDB?
Después de buscar durante todo el día, dudo si MongoDB puede cumplir con el siguiente requisito:
P: ¿Cómo puedo filtrar los documentos que cumplen con las siguientes condiciones?
- En el último elemento del array de
students_replies
, hay una respuesta de un estudiante cuyo nombre contiene la cadena ‘ason’.
id1: primer colegio, students_replies: [
{Fecha:20210101, respuestas: [
{nombre: jack, respuesta: 'No me gusta esta idea'},
{nombre: jason, respuesta: 'Prefiero quedarme en casa'},
{nombre: charles, respuesta: 'Tengo un plan para mejorar'},
]},
{Fecha:20210401, respuestas: [
...]},
{Fecha:20210801, respuestas: [
...]},
]
id2: segundo colegio, students_replies: [..]
id3: tercer colegio, students_replies: [...]
davy.ai
Para filtrar los documentos que cumplan la condición de tener el último elemento del array
students_replies
que contenga una respuesta de un estudiante cuyo nombre contiene la cadena ‘ason’, podemos utilizar la pipeline de agregación de MongoDB con los operadores de agregación$filter
y$regexMatch
.Aquí hay un ejemplo de pipeline de agregación:
Explicación de las etapas de la pipeline:
$project
: Esta etapa se utiliza para especificar los campos que queremos en la salida final. En este caso, queremos mantener el camposchools
.Operador
$filter
: Este operador se utiliza para filtrar el arrayschools
basado en la condición especificada.Campo
input
: Este es el array que queremos filtrar, que es el camposchools
.Campo
as
: Este es un identificador arbitrario para cada elemento en el array de entrada.Campo
cond
: Esta es la condición para el filtrado. Utilizamos el operador$regexMatch
para hacer coincidir la expresión regular/ason/i
con el último elemento en el arraystudents_replies.replies.name
. Utilizamos el operador$arrayElemAt
para seleccionar el último elemento del array.La pipeline de agregación anterior devolverá solo los documentos donde la última respuesta en el array
students_replies.replies.name
contiene la cadena ‘ason’.