2017-02-26 114 views
0

比方说,我有两个集合在我的数据库调用rumahsakit查找或forEach内部聚合MongoDB

先收藏称为dim_dokter

[{ 
    "_id": ObjectId("58b22c79e8c1c52bf3fad997"), 
    "nama_dokter": "Dr. Basuki Hamzah", 
    "spesialisasi": "Spesialis Farmakologi Klinik", 
    "alamat": " Jalan Lingkar Ring Road Utara, Yogyakarta " 
}, { 
    "_id": ObjectId("58b22c79e8c1c52bf3fad998"), 
    "nama_dokter": "Dr. Danie Nukman", 
    "spesialisasi": "Spesialis Anak", 
    "alamat": " Jalan Sudirman, Yogyakarta " 
}, { 
    "_id": ObjectId("58b22c79e8c1c52bf3fad999"), 
    "nama_dokter": "Dr. Bambang Kurnia", 
    "spesialisasi": "Spesialis Mikrobiologi Klinik", 
    "alamat": " Jalan Ahmad Yani, Yogyakarta " 
}] 

第二集合称为fact_perawatan

[{ 
    "_id": ObjectId("58b22d13e8c1c52bf3fad99a"), 
    "nama_pasien": "Clark", 
    "detail_perawatan": [{ 
     "id_dokter": ObjectId("58b22c79e8c1c52bf3fad997"), 
     "jumlah_obat": 1 
    }, { 
     "id_dokter": ObjectId("58b22c79e8c1c52bf3fad998"), 
     "jumlah_obat": 1 
    }] 
}] 

收集fact_perawatanid_dokter,实际上是指向dim_dokter._id。我想要聚合显示fact_perawatan集合中的这些数据,但是只显示id_dokter,我想从dim_dokter使用nama_dokter

这是我到目前为止的代码:

db.fact_perawatan.aggregate([ 
    { 
     $match: 
     { 
      '_id': db.fact_perawatan.find({"_id" : ObjectId("58b22d13e8c1c52bf3fad99a")})[0]._id 
     } 
    }, 
    { 
     $project: 
     { 
      nama_pasien: db.fact_perawatan.find({"_id": ObjectId("58b22d13e8c1c52bf3fad99a")})[0].nama_pasien, 
      perawatan: [ 
       { 
       dokter: db.dim_dokter.find({"_id" : db.fact_perawatan.find({"_id": ObjectId("58b22d13e8c1c52bf3fad99a")})[0].detail_perawatan[0].id_dokter})[0].nama_dokter, 

       }, 
      ] 
      } 
    } 
]) 

结果:

{ "_id" : ObjectId("58b22d13e8c1c52bf3fad99a"), "nama_pasien" : "Clark", "perawatan" : [ { "dokter" : "Dr. Basuki Hamzah" } ] } 

这些代码可以得到nama_dokterdim_dokter,但只有一个数据。在我的情况下,数据可以达到5个。做detail_perawatan [0]到[5]不是解决方案。

所以,此代码:

db.dim_dokter.find({"_id" : db.fact_perawatan.find({"_id": ObjectId("58b22d13e8c1c52bf3fad99a")})[0].detail_perawatan[0].id_dokter})[0].nama_dokter, 

如何让上面的代码回路尽可能多的在那里的数据?所以我可以得到所有的数据。

感谢

+0

你可以添加预期的回应,你的mongo版本是什么? – Veeram

+0

@Veeram'{“_id”:ObjectId(“58b22d13e8c1c52bf3fad99a”),“nama_pasien”:“Clark”,“perawatan”:[{“dokter”:“Basuki Hamzah博士”},{“dokter”:“ Danie Nukman“}]}'我正在使用mongo v3.4.1 – ytomo

回答

0

可以使用$lookup到左用dim_dokter加入由该$group下重新集结在perawatan场数据:

db.fact_perawatan.aggregate([{ 
    $match: { 
     '_id': ObjectId("58b22d13e8c1c52bf3fad99a") 
    } 
}, { 
    $unwind: "$detail_perawatan" 
}, { 
    $lookup: { 
     from: "dim_dokter", 
     localField: "detail_perawatan.id_dokter", 
     foreignField: "_id", 
     as: "dim_dokter" 
    } 
}, { 
    $unwind: "$dim_dokter" 
}, { 
    $group: { 
     _id: "$_id", 
     nama_pasien: { 
      $first: "$nama_pasien" 
     }, 
     perawatan: { 
      $push: { 
       "dokter": "$dim_dokter.nama_dokter" 
      } 
     } 
    } 
}]) 

$unwind用来解构阵列场detail_perawatan是能够$lookup之后

+0

谢谢,代码工作。我怎么才能从'dim_dokter'中得到'nama_dokter'?例如'{“_id”:ObjectId(“58b22d13e8c1c52bf3fad99a”),“nama_pasien”:“Clark”,“perawatan”:[{“dokter”:“Basuki Hamzah博士”},{“dokter” “}}}' – ytomo

+0

我已经更新了所需的格式,只需要'$ push'字段/值'”dokter“:”$ dim_dokter。nama_dokter“' –

+0

这是完美的工作。谢谢@Bertrand Martel – ytomo

0

这是3.4.1解决方案,如果您可以更新您的字段detail_perawatan

"detail_perawatan": [{ 
    "id_dokter": ObjectId("58b22c79e8c1c52bf3fad997"), 
    "jumlah_obat": 1 
}, { 
    "id_dokter": ObjectId("58b22c79e8c1c52bf3fad998"), 
    "jumlah_obat": 1 
}] 

"detail_perawatan": [ 
    ObjectId("58b22c79e8c1c52bf3fad997"), 
    ObjectId("58b22c79e8c1c52bf3fad998") 
] 

您可以使用简化汇聚一点点。

db.fact_perawatan.aggregate([{ 
    $match: { 
     _id: ObjectId("58b22d13e8c1c52bf3fad99a") 
    } 
}, { 
    $lookup: { 
     from: "dim_dokter", 
     localField: "detail_perawatan", 
     foreignField: "_id", 
     as: "detail_perawatan" 
    } 
}, { 
    $group: { 
     _id: "$_id", 
     nama_pasien: {$first: "$nama_pasien"}, 
     perawatan: {$push: {"dokter": {$arrayElemAt: ["$detail_perawatan.nama_dokter", 0]}}} 
    } 
}]) 
+0

由于某种原因,我需要保留'jumlah_obat'。 – ytomo