Blog de clase Tecnologías para el desarrollo de aplicaciones web

Blog de clase

View on GitHub
11 September 2021

Base de datos no relacionales - Inventario de dispositivos médicos.

by Santiago Henao Gonzalez, Santiago Gutierrez Pérez, Angie Dahiana Vargas Serna y Luisa María Zapata Saldarriaga

Introducción

Las instituciones hospitalarias requieren mantener un control estricto de los dispositivos médicos, por lo tanto se debe tener almacenada la información respecto a estos de manera ordenada y concisa, para solventar este problema se definen bases de datos que contienen los datos mas relevantes de cada dispositivo. Esto resulta útil para definir agendas de mantenimieno preventivo, control metrológico y tecnovigilancia, tambien para tener fácil acceso a la información de suministros ofrecidos por los proveedores en caso de requerir algún tipo de servicio.

Metodología

Para el diseño de la base de datos que se presenta a continuación se tuvieron en cuenta los siguientes criterios:

Para definir las colecciones, se definen los siguientes campos:

Colección: Inventario

Esta colección tendrá los dispositivos existentes en cada ubicación física del hospital, referenciando a los dispositivos con un identificador que inicia con las primeras letras del nombre del dispositivo y un consecutivo, ademas del estado de funcionamiento y la fecha del último mantenimiento realizado

Colección: Existencias

Colección: proveedores

Colección: Usuarios

Esta colección contiene la información de login y permisos de los usuarios para la base de datos

Diagrama

Referencias

La relación entre la colección de Inventarios y Existencias es de uno a muchos, porque pueden haber muchos dispositivos en Existencias que referencien a un solo dispositivo en Inventario

La relación entre la coleccion de Proveedores e Inventarios es de muchos a uno, porque un equipo puede tener diferentes proveedores, incluso de la misma marca

Diagramas

Colección: Existencias

image

Colección: Inventario

image

Colección: Proveedores

image

Colección: Login

image

En el siguiente enlace, encontrará información correspondiente, al código javaScript implementado para la creación de cada una de las colecciones, y las respectivas consultas realizadas https://github.com/Bio-web/tecnologias-web/blob/a8b872fc5cd682c9ecee7940d5705f019e7c0175/Proyecto_2/base.js

Consultas

1- Se requiere el nombre de los proveedores para el dispositivo regulador de vacío, únicamente los que se encuentren en el segundo piso

db.Existencias.aggregate([
    {
        $match:{
            $expr:{
                $and:[
                    {$eq:["$nombreDispositivo","Regulador vacío adulto"]},
                    {$eq:["$ubicacionDispositivo.piso",2]}
                ]
            }
        }
    },
    {
        $lookup:
        {
            from:"Inventario",
            localField:"tipoDispositivo",
            foreignField:"tipo.id",
            as: "informacionDispositivo",
            
        }
    },
    { $project : 
        { 
        "proveedor":"$informacionDispositivo.tipo.proveedor",
        "nombre":"$nombreDispositivo",
        "serial":"$tipoDispositivo",
        "piso":"$ubicacionDispositivo.piso",
        _id:0
        }
    },
    {
        $unwind: {
            path:"$proveedor"
        }
    },
    {
        $unwind: {
            path:"$proveedor"
        }
    }
]).pretty()

Resultado de la consulta:

{
    "proveedor" : "FLOW METER",
    "nombre" : "Regulador vacío adulto",
    "serial" : "Reg-1",
    "piso" : 2
}
{
    "proveedor" : "FLOW METER",
    "nombre" : "Regulador vacío adulto",
    "serial" : "Reg-1",
    "piso" : 2
}
{
    "proveedor" : "FLOW METER",
    "nombre" : "Regulador vacío adulto",
    "serial" : "Reg-1",
    "piso" : 2
}
{
    "proveedor" : "FLOW METER",
    "nombre" : "Regulador vacío adulto",
    "serial" : "Reg-1",
    "piso" : 2
}
{
    "proveedor" : "FLOW METER",
    "nombre" : "Regulador vacío adulto",
    "serial" : "Reg-1",
    "piso" : 2
}
{
    "proveedor" : "ABA Medica",
    "nombre" : "Regulador vacío adulto",
    "serial" : "Reg-2",
    "piso" : 2
}

**2- Una bomba de infusión requiere un repuesto y se desea contactar al proveedor para solicitar uno nuevo. Consultar los datos de los proveedores de bomba de infusión **

db.Inventario.aggregate([
    {
        $match:{
            $expr:{
                $and:[
                    {$eq:["$nombreDispositivo","Bomba de infusion"]}
                ]
            }
        }
    },
    {
        $unwind:"$tipo"
    },
    {
        $lookup:
        {
            from:"Proveedores",
            localField:"tipo.proveedor",
            foreignField:"Nombre",
            as: "informacionProveedor",  
        }
    },
    { $project : 
        { 
        "nombre":"$informacionProveedor.Nombre",
        "telefono":"$informacionProveedor.Telefono",
        "email":"$informacionProveedor.Email",
        _id:0
        }
    },
    {
        $unwind:"$nombre"
    },
    {
        $unwind:"$telefono"
    },
    {
        $unwind:"$email"
    },
]).pretty()

Resultado de la consulta:

{
    "nombre" : "AT. MEDICAS",
    "telefono" : 3654214,
    "email" : "contacto@atmedicas.com"
}
{
    "nombre" : "LINDE COLOMBIA S.A.",
    "telefono" : 202154,
    "email" : "contacto@lindesa.com"
}

3- Con el fin de llevar un registro de inventario, se requiere la información de cuántos dipositivos se encuentran en cada piso

db.Existencias.aggregate([
    { // Agrupando por piso y dispositivo para poder contar el número de dispositivos 
        $group:{
            _id:{
                piso:"$ubicacionDispositivo.piso",
                nombre:"$nombreDispositivo"
            },
            numeroDispositivos: { $count: { } }   
        }
    },
    {
        $group:{// Agrupando por piso
            _id:{piso:"$_id.piso"},
            "Dispositivos":{
                $push:
                 {
                    "nombre":"$_id.nombre",
                    "cantidad":"$numeroDispositivos"
                } 
            }
        }
    }
])

Resultado de la consulta:

{ "_id" : { "piso" : 3 }, "Dispositivos" : [ { "nombre" : "Ventilador", "cantidad" : 5 }, { "nombre" : "Tensiometro", "cantidad" : 5 } ] }
{ "_id" : { "piso" : 2 }, "Dispositivos" : [ { "nombre" : "Regulador vacío adulto", "cantidad" : 6 } ] }
{ "_id" : { "piso" : 1 }, "Dispositivos" : [ { "nombre" : "Bomba de infusion", "cantidad" : 2 } ] }

4- El comite de ingeniería requiere programar nuevos mantenimientos, para esto se necesita saber que dispositivos no han tenido mantenimiento los últimos dos años.

db.Existencias.find({ 
    fechaMantenimiento: { $lte: new Date("2019-01-05T00:00:00Z")}},
    {"nombreDispositivo":1 ,
    "ubicacionDispositivo":1 ,
    "fechaMantenimiento":1,
    "_id":0
}).pretty()

Resultado de la consulta:

{
    "nombreDispositivo" : "Bomba de infusion",
    "ubicacionDispositivo" : {
            "piso" : 1,
            "habitacion" : "105"
    },
    "fechaMantenimiento" : ISODate("2019-01-05T00:00:00Z")
}
{
    "nombreDispositivo" : "Bomba de infusion",
    "ubicacionDispositivo" : {
            "piso" : 1,
            "habitacion" : "106"
    },
    "fechaMantenimiento" : ISODate("2019-01-05T00:00:00Z")
}
{
    "nombreDispositivo" : "Regulador vacío adulto",
    "ubicacionDispositivo" : {
            "piso" : 2,
            "habitacion" : "201"
    },
    "fechaMantenimiento" : ISODate("2018-01-05T00:00:00Z")
}
{
    "nombreDispositivo" : "Regulador vacío adulto",
    "ubicacionDispositivo" : {
            "piso" : 2,
            "habitacion" : "202"
    },
    "fechaMantenimiento" : ISODate("2018-01-05T00:00:00Z")
}
{
    "nombreDispositivo" : "Regulador vacío adulto",
    "ubicacionDispositivo" : {
            "piso" : 2,
            "habitacion" : "203"
    },
    "fechaMantenimiento" : ISODate("2018-01-05T00:00:00Z")
}
{
    "nombreDispositivo" : "Regulador vacío adulto",
    "ubicacionDispositivo" : {
            "piso" : 2,
            "habitacion" : "204"
    },
    "fechaMantenimiento" : ISODate("2018-01-05T00:00:00Z")
}
{
    "nombreDispositivo" : "Regulador vacío adulto",
    "ubicacionDispositivo" : {
            "piso" : 2,
            "habitacion" : "205"
    },
    "fechaMantenimiento" : ISODate("2018-01-05T00:00:00Z")
}
{
    "nombreDispositivo" : "Tensiometro",
    "ubicacionDispositivo" : {
            "piso" : 3,
            "habitacion" : "302"
    },
    "fechaMantenimiento" : ISODate("2018-01-05T00:00:00Z")
}
{
    "nombreDispositivo" : "Tensiometro",
    "ubicacionDispositivo" : {
            "piso" : 3,
            "habitacion" : "303"
    },
    "fechaMantenimiento" : ISODate("2018-01-05T00:00:00Z")
}
{
    "nombreDispositivo" : "Tensiometro",
    "ubicacionDispositivo" : {
            "piso" : 3,
            "habitacion" : "304"
    },
    "fechaMantenimiento" : ISODate("2018-01-05T00:00:00Z")
}
{
    "nombreDispositivo" : "Tensiometro",
    "ubicacionDispositivo" : {
            "piso" : 3,
            "habitacion" : "305"
    },
    "fechaMantenimiento" : ISODate("2018-01-05T00:00:00Z")
}
{
    "nombreDispositivo" : "Tensiometro",
    "ubicacionDispositivo" : {
            "piso" : 3,
            "habitacion" : "306"
    },
    "fechaMantenimiento" : ISODate("2018-01-05T00:00:00Z")
}
{
    "nombreDispositivo" : "Ventilador",
    "ubicacionDispositivo" : {
            "piso" : 3,
            "habitacion" : "301"
    },
    "fechaMantenimiento" : ISODate("2016-01-05T00:00:00Z")
}
{
    "nombreDispositivo" : "Ventilador",
    "ubicacionDispositivo" : {
            "piso" : 3,
            "habitacion" : "302"
    },
    "fechaMantenimiento" : ISODate("2016-01-05T00:00:00Z")
}
{
    "nombreDispositivo" : "Ventilador",
    "ubicacionDispositivo" : {
            "piso" : 3,
            "habitacion" : "303"
    },
    "fechaMantenimiento" : ISODate("2016-01-05T00:00:00Z")
}
{
    "nombreDispositivo" : "Ventilador",
    "ubicacionDispositivo" : {
            "piso" : 3,
            "habitacion" : "304"
    },
    "fechaMantenimiento" : ISODate("2016-01-05T00:00:00Z")
}
{
    "nombreDispositivo" : "Ventilador",
    "ubicacionDispositivo" : {
            "piso" : 3,
            "habitacion" : "305"
    },
    "fechaMantenimiento" : ISODate("2016-01-05T00:00:00Z")
}

5- Se requiere hacer un proceso de obsolescencia para esto se necesita conocer la cantidad total de dispositivos activos e inactivos en todo el hospital.

db.Existencias.aggregate([
    {
        $group:{
            _id:{
                Estado:"$estado"
            },
            numeroDispositivos: { $count: { } }   
        }
    }
])

Resultado de la consulta:

{ "_id" : { "Estado" : 1 }, "numeroDispositivos" : 18 }
{ "_id" : { "Estado" : 0 }, "numeroDispositivos" : 1 }

Conclusiones

Referencias bibliográficas

  1. Hospira PLUM A+, System Operating Manual. Tomado de:https://www.icumed.com/media/9566/plum_aplus_with_hospira_mednet_software.pdf
  2. Documentación mongoDB. Tomado de: https://docs.mongodb.com/guides/