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.