DANH MỤC: NODE.JS & MONGODB

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 productscategories 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'}

 

Nguồn: Toidicode.com

Thông tin tác giả

Vũ Thanh Tài

Vũ Thanh Tài

Biển học vô biên, quay đầu là dại!

Hãy tham gia group facebook để cùng giao lưu chia sẻ kiến thức! Tham Gia