Toidicode.com

Toidicode.com

BASIC TO ADVANCE

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

 

Đăng ký nhận tin.

Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!

Vũ Thanh Tài

About author
The best way to learn is to share
Xem tất cả bài đăng

0 Comments

Bài viết chưa có ai bình luận, hãy là người đầu tiên đi bạn!

Bình luận

Captcha