Aggregation, Join Table ala MongoDB: Sebuah Studi Kasus

Bagi mereka yang sudah lihai menggunakan SQL, pasti tidak asing dengan query “JOIN” yang digunakan untuk menggabungkan 2 atau lebih tabel. Pertanyannya, apakah hal ini juga mungkin dilakukan pada collection NoSQL?

Pada kasus ini, kita akan menggunakan MongoDB salah satu Document Based NoSQL. Pada Document Based NoSQL, instance data disimpan dalam object yang tertata pada collection atau document database. Untuk menggabungkan 2 atau lebih collection, pada NoSQL, khususnya pada mongoDB, terdapat sebuah fitur yang disebut aggregation.

Sebagaimana yang telah dijelaskan dalam artikelku sebelumnya, ada beberapa fungsi aggregation yang dapat digunakan sebagai pengganti join table di MongoDB. Untuk lebih lengkapnya, kamu bisa baca dulu di sini.

Pada studi kasus kali ini, kita akan menggunakan database yang dirancang untuk aplikasi pengingat tugas. Sebelum lebih jauh, temen-temen perlu memahami dahulu seperti apa arsitektur database yang kita gunakan. Berikut adalah arsitektur database yang digunakan.

Arsitektur Database Latihan

Daftar Grup yang Diikuti User

Kita akan menampilkan daftar dan informasi grup yang diikuti user, baik sebagai owner, maintainer, maupun member. Untuk melakukan hal ini pipeline yang kita miliki hanya perlu melakukan lookup melalui group_list yang dimiliki user.

[
{
$match:
{
_id: ObjectId("6401d6c7d6b91267a5712bd1"),
},
},
{
$lookup:
{
from: "group",
localField: "group_list",
foreignField: "_id",
as: "data",
},
}
]

Sebenarnya sampai sini, kamu sudah akan mendapatkan hasil berupa daftar tugas yang masih aktif. Namun, untuk mengekstrak hal tersebut, kamu harus masuk ke dalam child dari child respon yang diterima. Untuk mempermudah komunikasi kamu dapat menambah script berikut pada pipeline. Agar response untuk client side dapat diperindah, dan menurunkan komputasi di sisi client.

[
{
$unwind:
{
path: "$data",
includeArrayIndex: "string",
preserveNullAndEmptyArrays: false,
},
},
{
$replaceRoot:
{
newRoot: "$data",
},
},
]

Daftar Tugas User yang Masih Aktif

untuk mendapatkan daftar ini, gunakan user collection sebagai basis pencarian. Kemudian lakukan filter untuk memilih user mana yang datanya ingin diekstraksi. Untuk mendapatkan tugas yang diinginkan maka kita akan menggunakan dua fungsi agregasi: match, lookup dengan pipeline.

[
{
$lookup: {
from: "group",
localField: "group_list",
foreignField: "_id",
pipeline: [
{
$lookup: {
from: "class",
localField: "classes",
foreignField: "_id",
as: "class",
},
},
{
$lookup: {
from: "task",
localField: "class.active_task_list",
foreignField: "_id",
pipeline: [
{
$lookup: {
from: "tags",
localField: "tags",
foreignField: "_id",
as: "tags",
},
},
{
$match: {
date_due: {
$gte: Date(),
},
},
},
],
as: "tasks",
},
},
],
as: "data",
},
}
]

Sebagaimana pada kasus pertama, kita dapat melakukan unwind dan replace root untuk memperbaiki format response untuk client.

[
{
$unwind:
{
path: "$data",
includeArrayIndex: "string",
preserveNullAndEmptyArrays: false,
},
},
{
$unwind:

{
path: "$data.tasks",
includeArrayIndex: "string",
preserveNullAndEmptyArrays: false,
},
},
{
$replaceRoot:
{
newRoot: "$data.tasks",
},
}
]

End of the story, Editors Note

Sebagaimana join operation pada SQL. Operasi tunggal kadang tidak cukup untuk menyelesaikan persoalan di dunia nyata. Untuk mengatasi hal tersebut, mongoDB menyediakan pipeline yang dapat kita rekayasa dengan menaruhnya dalam lookup untuk meniru operasi nested join yang ada pada SQL.

Dibalik kefleksibelan strukturnya, NoSQL database menyimpan kerumitan dalam operasi kompleks serta statistikal. Oleh sebab itu, MongoDB cocok digunakan pada tahap pengembangan. Jika telah menemukan struktur yang pas, pada program dengan database yang complex menggunakan SQl dengan berbagai jenis tuning diyakini dapat meningkatkan performa pemanggilan data.

--

--