# Segments

{% hint style="success" %}
This is the official documentation of the `@forestadmin/agent` Node.js agent.
{% endhint %}

A Segment is a subset of a Collection: it's a saved filter of your Collection.

Segments are designed for those who want to *systematically* visualize data according to specific sets of filters. It allows you to save filter configurations so user don’t have to do repetitive actions every day.

![](https://3861847666-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9UN5oBJhgzLadOqi7jx6%2Fuploads%2Fgit-blob-b91265b079fd224c5918e2e8fabdee9d1f92d6c4%2Fsegment-example.png?alt=media)

## From your admin panel

Segments can be configured from the interface, without the need to write any code.

This is documented in the [User Guide](https://docs.forestadmin.com/user-guide/collections/segments).

## From your Agent

Sometimes, Segment filters are complicated and closely tied to your business. Forest Admin allows you to code how the Segment is computed.

For instance, in our [Live Demo example](https://app.forestadmin.com/livedemo), we’ve implemented a Segment on the collection `products` to allow admin users to see the bestsellers at a glance.

### Example

{% hint style="info" %}
In the following example, we are making queries using the [Forest Admin Query Interface](https://docs.forestadmin.com/developer-guide-agents-nodejs/data-sources/getting-started).

As Forest Admin does not impose any restriction on the handler, you are free to call external APIs or query your database directly instead.
{% endhint %}

The only requirement when implementing a Segment from your agent is to return a valid `ConditionTree` (see [Understanding Filters](https://docs.forestadmin.com/developer-guide-agents-nodejs/data-sources/getting-started/queries/filters)).

```javascript
agent.customizeCollection('products', collection =>
  collection.addSegment('mostPurchased', async context => {
    // Query the ids of the 10 most ordered products.
    const rows = await context.dataSource
      .getCollection('orders')
      .aggregate({}, { operation: 'Count', groups: [{ field: 'product_id' }] }, 10);

    // Return a condition tree which matches those records
    return { field: 'id', operator: 'In', value: rows.map(r => r['product_id']) };
  });
);
```
