Điện thoại/ Zalo
0389934723
Bài 9: Join collection trong MongoDB trên Node.js
Như các bạn đã biết thì ở các cơ sở dữ liệu quan hệ các table được liên kết với nhau bằng các khóa ngoại và kháo chính. Và MongoDB không phải là cơ sở dữ liệu quan hệ, nhưng nó cũng hỗ trợ chúng ta join các collection lại với nhau.
1, Join collection trong MongoDB trên Node.js.
-Để có thể join các collection lại với nhau được thì các collection đó phải có ít nhất 1 điểm chung. Tiếp theo đó bạn sử dụng cú pháp sau để join giữa 2 bảng:
db.collection(collection1).aggregate([
{ $lookup:
{
from: 'collection2',
localField: 'colection2_id',
foreignField: 'collection1_id',
as: 'fieldName'
}
}
], function(err, res) {
//handle
});
});
Trong đó:
collection1
là collection mà bạn muốn thực thi truy vấn.collection2
là collection mà bạn muốn join với collection1.collection2_id
là trường có điểm chung của collection2.colleciton1_id
là trường có điểm chung của collection1.fieldName
là key mà bạn muốn đặt cho trường chứa phép join.
2, Ví Dụ.
-Giả sử chúng ta có 2 collection products và categories như sau:
- product:
{_id: 1, name: 'Ao thun', price: 50000, category_id: 2},
{_id: 2, name: 'Ao phong', price: 80000, category_id: 2},
{_id: 3, name: 'Quan bo', price: 150000, category_id: 1},
{_id: 4, name: 'Quan tho', price: 250000, category_id: 1}
- categories:
{_id: 1, name: "Quan"},
{_id: 2, name: "Ao"}
Và Đây là code join products vào trong categories.
const mongoClient = require('mongodb').MongoClient;
mongoClient.connect('mongodb://127.0.0.1:27017/nodejoin', function(err, db) {
if (err) throw err;
const col = db.collection('categories')
col.aggregate([
{$lookup: {
from: 'products',
localField: '_id',
foreignField: 'category_id',
as: 'productList'
}}
],function (err,res) {
if (err) throw err;
console.log(res);
});
});
Kết Quả:
[{
_id: 1,
name: 'Quan',
productList: [{ _id: 3, name: 'Quan bo', price: 150000, category_id: 1 },
{ _id: 4, name: 'Quan tho', price: 250000, category_id: 1 }
]
},
{
_id: 2,
name: 'Ao',
productList: [{ _id: 1, name: 'Ao thun', price: 50000, category_id: 2 },
{ _id: 2, name: 'Ao phong', price: 80000, category_id: 2 }
]
}
]
Và ngược lại bạn cũng có thể join categories vào trong products:
const mongoClient = require('mongodb').MongoClient;
mongoClient.connect('mongodb://127.0.0.1:27017/nodejoin', function(err, db) {
if (err) throw err;
const col = db.collection('products')
col.aggregate([
{$lookup: {
from: 'categories',
localField: 'category_id',
foreignField: '_id',
as: 'category'
}}
],function (err,res) {
if (err) throw err;
console.log(res);
});
});
Kết quả:
[{
_id: 1,
name: 'Ao thun',
price: 50000,
category_id: 2,
category: [{ _id: 2, name: 'Ao' }]
},
{
_id: 2,
name: 'Ao phong',
price: 80000,
category_id: 2,
category: [{ _id: 2, name: 'Ao' }]
},
{
_id: 3,
name: 'Quan bo',
price: 150000,
category_id: 1,
category: [{ _id: 1, name: 'Quan' }]
},
{
_id: 4,
name: 'Quan tho',
price: 250000,
category_id: 1,
category: [{ _id: 1, name: 'Quan' }]
}
]
3, Lời kết.
-Phần trên chỉ là mình giới thiệu thêm về chức năng join collection trong MongoDB thôi, còn trên thực tế thì khi sử dụng MongoDB thì chúng ta có thể lưu giữ liệu trực tiếp mà không cần phải join.
VD:
{_id: 4, name: 'Quan tho', price: 250000, category: 'Quan'}