MongoDB 3.2 sekarang memungkinkan seseorang untuk menggabungkan data dari beberapa koleksi menjadi satu melalui tahap agregasi $lookup. Sebagai contoh praktis, katakanlah Anda memiliki data tentang buku yang dibagi menjadi dua koleksi berbeda.
Koleksi pertama, disebut books
, dengan data sebagai berikut:
{
"isbn": "978-3-16-148410-0",
"title": "Some cool book",
"author": "John Doe"
}
{
"isbn": "978-3-16-148999-9",
"title": "Another awesome book",
"author": "Jane Roe"
}
Dan koleksi kedua, disebut books_selling_data
, dengan data sebagai berikut:
{
"_id": ObjectId("56e31bcf76cdf52e541d9d26"),
"isbn": "978-3-16-148410-0",
"copies_sold": 12500
}
{
"_id": ObjectId("56e31ce076cdf52e541d9d28"),
"isbn": "978-3-16-148999-9",
"copies_sold": 720050
}
{
"_id": ObjectId("56e31ce076cdf52e541d9d29"),
"isbn": "978-3-16-148999-9",
"copies_sold": 1000
}
Untuk menggabungkan kedua koleksi hanya masalah menggunakan $lookup dengan cara berikut:
db.books.aggregate([{
$lookup: {
from: "books_selling_data",
localField: "isbn",
foreignField: "isbn",
as: "copies_sold"
}
}])
Setelah agregasi ini, books
koleksi akan terlihat seperti berikut:
{
"isbn": "978-3-16-148410-0",
"title": "Some cool book",
"author": "John Doe",
"copies_sold": [
{
"_id": ObjectId("56e31bcf76cdf52e541d9d26"),
"isbn": "978-3-16-148410-0",
"copies_sold": 12500
}
]
}
{
"isbn": "978-3-16-148999-9",
"title": "Another awesome book",
"author": "Jane Roe",
"copies_sold": [
{
"_id": ObjectId("56e31ce076cdf52e541d9d28"),
"isbn": "978-3-16-148999-9",
"copies_sold": 720050
},
{
"_id": ObjectId("56e31ce076cdf52e541d9d28"),
"isbn": "978-3-16-148999-9",
"copies_sold": 1000
}
]
}
Beberapa hal yang perlu diperhatikan:
- Koleksi "dari", dalam hal ini
books_selling_data
, tidak dapat di-sharding. - Bidang "sebagai" akan berupa larik, seperti contoh di atas.
- Opsi "localField" dan "foreignField" pada tahap $lookup akan diperlakukan sebagai null untuk tujuan pencocokan jika tidak ada di koleksi masing-masing (dokumen $lookup memiliki contoh sempurna tentang hal itu).
Jadi, sebagai kesimpulan, jika Anda ingin menggabungkan kedua koleksi, memiliki, dalam hal ini, bidang datar copy_sold dengan total salinan yang terjual, Anda harus bekerja sedikit lebih lama, mungkin menggunakan koleksi perantara yang akan, kemudian, menjadi $out untuk koleksi akhir.