简体   繁体   English

在内部MongoDB中查找或查找每个

[英]Find or forEach Inside Aggregate MongoDB

Let's say I have two collection in my database call rumahsakit . 假设我的数据库调用rumahsakit有两个集合。

First collection called dim_dokter : 第一个集合称为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 "
}]

Second collection called fact_perawatan : 第二个集合称为fact_perawatan

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

Collection fact_perawatan have the id_dokter that is actually point to the dim_dokter._id . 收集fact_perawatan有,实际上是指向dim_dokter._idid_dokter。 I want to do aggregation to show this data in fact_perawatan collection but instead showing just the id_dokter , I want to use nama_dokter from dim_dokter . 我想进行汇总以在fact_perawatan集合中显示此数据,但我只想使用nama_dokterid_dokter ,而不是仅显示dim_dokter

This is my code so far: 到目前为止,这是我的代码:

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,

              },
            ]  
          }
   }
])

result: 结果:

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

Those code can get the nama_dokter from dim_dokter , but only one data. 这些代码可以得到nama_dokterdim_dokter ,但只有一个数据。 In my case, the data can be up to 5. do the detail_perawatan[0] to [5] is not solution. 在我的情况下,数据最多可以为5。执行detail_perawatan [0]至[5]是不可行的。

So, this code: 因此,此代码:

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

How make the code above to loop as many as the data in there ? 如何使上面的代码循环访问其中的数据? so I can get all the data. 这样我就可以获得所有数据。

Thanks 谢谢

You can use a $lookup to left join with dim_dokter following by a $group to regroup your data in perawatan field : 您可以使用$lookupdim_dokterdim_dokter ,然后再使用$groupperawatan字段中重新组合数据:

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"
            }
        }
    }
}])

The $unwind is used to deconstruct the array field detail_perawatan to be able to $lookup afterwards $unwind用于解构数组字段detail_perawatan以便以后可以进行$lookup

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM