2017-02-26 110 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