sql >> Base de Datos >  >> NoSQL >> MongoDB

Obtenga valores distintos de la matriz en función de las condiciones dentro de la matriz

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".