Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

174
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda