Tengo un formulario de documento similar a este
{ "doc-id":2, "interfaces": [ { "interface-role": "ON", "port-nb": 1 }, { "interface-role": "OFF", "port-nb": 2 }, { "interface-role": "ON", "port-nb": 3 }, { "interface-role": "OFF", "port-nb": 3 } ] }Quiero consultar y obtener interfaces de documentos específicas y también tener la capacidad de activar y desactivar filtros y eso es lo que intenté hasta ahora.
const doc = await this.doc .findOne({ 'doc-id': docId, 'interfaces["interface-role"]': interfaceRole, //ON or OFF }) .select({ interfaces: 1, _id: 0 }) .exec();entonces, el resultado que quiero obtener es obtener interfaces si no hay un filtro para el rol de las interfaces y, si hay uno, obtener las interfaces filtradas
Puede usar un $or para hacer el filtrado condicional con un $filter .
db.collection.aggregate([ { $match: { "doc-id": 2 } }, { "$addFields": { "interfaces": { "$filter": { "input": "$interfaces", "as": "i", "cond": { $or: [ { $eq: [ null, <interfaceRole> ] }, { $eq: [ "$$i.interface-role", <interfaceRole> ] } ] } } } } } ]) Aquí está el patio de recreo de Mongo cuando no se proporciona interfaceRole .
Aquí está el patio de recreo de Mongo cuando se proporciona interfaceRole .