Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

171
Vistas
Filtro anidado de anidado en Mongoose Populate

Tengo un objeto que se ve así: (ese es el resultado de la consulta Mongoose )

 let systems = [ { "maxUserLevel": 1, "subsystems": [ { "sections": [], "name": "apple" }, { "sections": [ { "name": "banana" } ], "name": "sun", }, { "sections": [], "name": "orange" } ], "systemID": "12345" }, { "maxUserLevel": 3, "subsystems": [ { "sections": [], "name": "blue" }, { "sections": [ { "name": "pink" } ], "name": "red", }, ], "systemID": "15654" }];

La consulta de Mangosta:

 this.model.System.find({username: user.username}, { _id: 0, allowedOrganizations: 0, name: 0, updatedAt: 0, createdAt: 0, versionKey: 0 }) .populate( { path: "subsystems", populate: { path: "sections", select: "name -_id", match: { allowedUsers: user.id } }, select: "name metadata -_id", } ) .exec((error, systems) => { return res.status(200).json({ data: systems, success: true }); });

Estoy buscando una manera de eliminar los subsystems que no tienen sections . Después de horas de búsqueda, creo que no hay forma de filtrar la populate en función de la populate anidada, así que probé algunas formas como esta:

 if (systems.subsystems.length > 0) { let test = []; systems.subsystems.forEach((value, index) => { if (value.sections.length !== 0) { test[index] = value; } if (systems.subsystems.length === index + 1) { return test; } }) }

Pero no estoy seguro si esta es la forma correcta.

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Puede usar una consulta agregada con $filter como esta:

 db.collection.aggregate([ { "$project": { "_id": 1, "maxUserLevel": 1, "subsystems": { "$filter": { "input": "$subsystems", "as": "s", "cond": { "$ne": [ "$$s.sections", [] ] } } } } } ])

Ejemplo aquí

Además, su consulta debe contener una etapa $match (como su etapa de find ) y $lookup .

about 4 years ago · Juan Pablo Isaza Denunciar

0

No estoy seguro de que esta sea la mejor manera , pero resolvió mi problema:

 const _ = require('lodash'); systems.forEach((value, index) => { systems[index].subsystems = _.filter(value.subsystems, item => !item.sections.length == 0 ); if (systems.length === index + 1) { return systems; } });

Elimina todos los subsystems que no tienen sections .

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda