Saltar al contenido

MongoDB une datos dentro de un array de objetos

Si encuentras alguna parte que no entiendes puedes dejarnos un comentario y haremos todo lo necesario de ayudarte tan rápido como podamos.

Solución:

Usando MongoDB 3.4.4 y más reciente

Con el marco de agregación, el $lookup los operadores admiten arreglos

db.diagnoses.aggregate([
     "$addFields":  
        "prescription":  "$ifNull" : [ "$prescription", [ ] ]     
     ,
     "$lookup": 
        "from": "drugs",
        "localField": "prescription.drug",
        "foreignField": "_id",
        "as": "drugs"
     ,
     "$addFields": 
        "prescription": 
            "$map": 
                "input": "$prescription",
                "in": 
                    "$mergeObjects": [
                        "$$this",
                         "drug": 
                            "$arrayElemAt": [
                                "$drugs",
                                 
                                    "$indexOfArray": [
                                        "$drugs._id",
                                        "$$this.drug"
                                    ] 
                                
                            ]
                         
                    ]
                
            
        
     ,
     "$project":  "drugs": 0  
])

Para versiones anteriores de MongoDB:

Puede crear una canalización que primero aplane el prescription array utilizando el $unwind operador y un $lookup paso de tubería posterior para hacer una “unión externa izquierda” en la colección de “drogas”. Aplicar otro $unwind operación sobre lo creado array del campo “unido”. $group los documentos previamente aplanados de la primera tubería donde había $unwind el operador genera un documento para cada elemento de la prescripción array.

Al ensamblar la tubería anterior, ejecute la siguiente operación agregada:

db.diagnoses.aggregate([
     
        "$project":                
            "patientid": 1,
            "doctorid": 1,
            "medicalcondition": 1,
            "diagnosis": 1,
            "addmissiondate": 1,
            "dischargedate": 1,
            "bhtno": 1,
            "prescription":  "$ifNull" : [ "$prescription", [ ] ]  
        
    ,
    
       "$unwind": 
           "path": "$prescription",
           "preserveNullAndEmptyArrays": true
        
    ,      
    
        "$lookup": 
            "from": "drugs",
            "localField": "prescription.drug",
            "foreignField": "_id",
            "as": "prescription.drug"
        
    ,
     "$unwind": "$prescription.drug" ,
     
        "$group": 
            "_id": "$_id",
            "patientid" :  "$first": "$patientid" ,
            "doctorid" :  "$first": "$doctorid" ,
            "medicalcondition" :  "$first": "$medicalcondition" ,
            "diagnosis" :  "$first": "$diagnosis" ,
            "addmissiondate" :  "$first": "$addmissiondate" ,
            "dischargedate" :  "$first": "$dischargedate" ,
            "bhtno" :  "$first": "$bhtno" ,
            "prescription" :  "$push": "$prescription" 
        
    
])

Salida de muestra


    "_id" : ObjectId("582d43d18ec3f432f3260682"),
    "patientid" : ObjectId("582aacff3894c3afd7ad4677"),
    "doctorid" : ObjectId("582a80c93894c3afd7ad4675"),
    "medicalcondition" : "high fever, cough, runny nose.",
    "diagnosis" : "Viral Flu",
    "addmissiondate" : "2016-01-12",
    "dischargedate" : "2016-01-16",
    "bhtno" : "125",
    "prescription" : [ 
        
            "drug" : 
                "_id" : ObjectId("58345e0e996d340bd8126149"),
                "genericname" : "Paracetamol Tab 500mg",
                "type" : "X",
                "isbrand" : false
            ,
            "instructions" : "Take 2 daily, after meals."
        , 
        
            "drug" : 
                "_id" : ObjectId("5836bc0b291918eb42966320"),
                "genericname" : "Paracetamol Tab 100mg",
                "type" : "Y",
                "isbrand" : false
            ,
            "instructions" : "Take 1 daily, after meals."
        
    ]

Sección de Reseñas y Valoraciones

Si haces scroll puedes encontrar las críticas de otros administradores, tú asimismo tienes la libertad de mostrar el tuyo si dominas el tema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *