查找或forEach Inside Aggregate MongoDB

时间:2017-02-26 01:46:14

标签: mongodb aggregation-framework

假设我的数据库调用rumahsakit中有两个集合。

第一个名为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_perawatan id_dokter 实际上指向 dim_dokter._id 。我想进行聚合以在fact_perawatan集合中显示此数据,而只显示id_dokter,我想使用nama_dokter中的dim_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_dokter获取dim_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,

如何使上面的代码循环与那里的数据一样多?所以我可以获得所有数据。

由于

1 个答案:

答案 0 :(得分:0)

您可以$lookup使用$groupdim_dokter联系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" } } } }]) 字段中重新整理您的数据:

detail_perawatan

$unwind用于解构数组字段$lookup以便之后可以# declare score as integer score = int # declare rating as character rating = chr # write "Enter score: " # input score score = input("Enter score: ") # if score == 10 Then # set rating = "A" # endif if score == 10: rating = "A" print(rating)