Condiciones de consulta con .distinct()
se aplican a la "selección de documentos" y no a las entradas de matriz contenidas "dentro" del documento. Si necesita "filtrar" el contenido de la matriz, aplique .aggregate()
en su lugar, así como un pequeño procesamiento posterior para obtener solo los "valores" en la respuesta de la matriz.
db.collection.aggregate([
{ "$match": { "_id": "TEST" } },
{ "$unwind": "$payload" },
{ "$match": { "payload.status": { "$in": ["TRUE","FALSE"] } } },
{ "$group": { "_id": "$payload._id" } },
]).map( d => d._id );
Las partes principales son $unwind
Etapa de canalización que hace principalmente porque desea que los valores dentro de la matriz se usen más tarde como la clave para $group
en. Básicamente, esto produce un nuevo documento para cada miembro de la matriz, pero cada documento solo contiene ese miembro de la matriz. Está "desnormalizando" las estructuras de MongoDB que contienen matrices.
Lo siguiente es lo siguiente $match
canalización, que funciona como cualquier consulta y solo selecciona documentos que cumplen las condiciones. Dado que todos los miembros de la matriz ahora son "documentos", las entradas que no coinciden (como documentos) se excluyen. Alternativamente, podría usar $filter
para extraer mientras aún es una matriz, pero como necesitamos $unwind
para la siguiente etapa también podemos simplemente $match
.
En este punto, solo le quedan las entradas de la matriz que coinciden con las condiciones. El $group
es obtener valores "distintos", por lo que normalmente haría esto en una selección más amplia que un solo documento o cualquier cosa donde los valores aquí no sean ya distintos. Entonces, esto realmente solo mantiene el mismo comportamiento de .distinct()
intacto.
Finalmente, desde la salida de .aggregate()
difiere del diseño de .distinct()
ya que devuelve "documentos" en los resultados, simplemente usamos el .map()
para procesar los resultados del cursor y devolver solo los "valores" de la propiedad del documento específico como una "matriz".