# Phương thức aggregate() trong MongoDB

Với Aggregation trong MongoDB, bạn nên sử dụng phương thức aggregate().

## Cú pháp <a href="#c-ph-p" id="c-ph-p"></a>

Cú pháp cơ bản của phương thức aggregate() là như sau:

```
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
```

## Ví dụ <a href="#v-d" id="v-d"></a>

Trong Collection, bạn có dữ liệu sau:

```javascript
{

    _id: ObjectId(7 df78ad8902c)

    title: 'MongoDB Overview',

    description: 'MongoDB is no sql database',

    by_user: 'tutorials point',

    url: 'http://www.tutorialspoint.com',

    tags: ['mongodb', 'database', 'NoSQL'],

    likes: 100

},

{

    _id: ObjectId(7 df78ad8902d)

    title: 'NoSQL Overview',

    description: 'No sql database is very fast',

    by_user: 'tutorials point',

    url: 'http://www.tutorialspoint.com',

    tags: ['mongodb', 'database', 'NoSQL'],

    likes: 10

},

{

    _id: ObjectId(7 df78ad8902e)

    title: 'Neo4j Overview',

    description: 'Neo4j is no sql database',

    by_user: 'Neo4j',

    url: 'http://www.neo4j.com',

    tags: ['neo4j', 'database', 'NoSQL'],

    likes: 750

}
```

Từ Collection trên, nếu bạn muốn hiển thị một danh sách có bao nhiêu bài hướng dẫn được viết bởi mỗi người dùng, thì bạn sẽ sử dụng phương thức **aggregate()** như sau:

```
> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])

{

"result" : [

{

"_id" : "tutorials point",

"num_tutorial" : 2

},

{

"_id" : "Neo4j",

"num_tutorial" : 1

}

],

"ok" : 1

}

>
```

Truy vấn SQL tương đương cho trường hợp trên là **select by\_user, count(\*) from mycol group by by\_user**.

Trong ví dụ trên, chúng ta đã nhóm các Document bởi trường **by\_user** và trên mỗi lần xuất hiện của by\_user, giá trị trước đó của tổng sẽ được tăng lên. Có một danh sách các biểu thức Aggregation có sẵn, được liệt kê dưới đây:

| **Biểu thức** | **Miêu tả**                                                                      | **Ví dụ**                                                                                 |
| ------------- | -------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
| $sum          | Tổng giá trị được xác định từ tất cả Document trong Collection đó                | db.mycol.aggregate(\[{$group : {\_id : "$by\_user", num\_tutorial : {$sum : "$likes"}}}]) |
| $avg          | Tính trung bình của tất cả giá trị đã cho từ tất cả Document trong Collection đó | db.mycol.aggregate(\[{$group : {\_id : "$by\_user", num\_tutorial : {$avg : "$likes"}}}]) |
| $min          | Lấy giá trị nhỏ nhất của các giá trị từ tất cả Document trong Collection đó      | db.mycol.aggregate(\[{$group : {\_id : "$by\_user", num\_tutorial : {$min : "$likes"}}}]) |
| $max          | Lấy giá trị lớn nhất của các giá trị từ tất cả Document trong Collection đó      | db.mycol.aggregate(\[{$group : {\_id : "$by\_user", num\_tutorial : {$max : "$likes"}}}]) |
| $push         | Chèn giá trị vào trong một mảng trong Document kết quả                           | db.mycol.aggregate(\[{$group : {\_id : "$by\_user", url : {$push: "$url"}}}])             |
| $addToSet     | Chèn giá trị tới một mảng trong Document kết quả, nhưng không tạo các bản sao    | db.mycol.aggregate(\[{$group : {\_id : "$by\_user", url : {$addToSet : "$url"}}}])        |
| $first        | Lấy Document đầu tiên từ Source Document theo nhóm                               | db.mycol.aggregate(\[{$group : {\_id : "$by\_user", first\_url : {$first : "$url"}}}])    |
| $last         | Lấy Document cuối cùng từ Source Document theo nhóm                              | db.mycol.aggregate(\[{$group : {\_id : "$by\_user", last\_url : {$last : "$url"}}}])      |
