---
title: "CollectionFilter"
generated: true
---
<GenerationInfo sourceFile="packages/core/src/config/catalog/collection-filter.ts" sourceLine="64" packageName="@vendure/core" />

A CollectionFilter defines a rule which can be used to associate ProductVariants with a Collection.
The filtering is done by defining the `apply()` function, which receives a TypeORM
[`QueryBuilder`](https://typeorm.io/#/select-query-builder) object to which clauses may be added.

Creating a CollectionFilter is considered an advanced Vendure topic. For more insight into how
they work, study the [default collection filters](https://github.com/vendurehq/vendure/blob/master/packages/core/src/config/catalog/default-collection-filters.ts)

Here's a simple example of a custom CollectionFilter:

*Example*

```ts
import { CollectionFilter, LanguageCode } from '@vendure/core';

export const skuCollectionFilter = new CollectionFilter({
  args: {
    // The `args` object defines the user-configurable arguments
    // which will get passed to the filter's `apply()` function.
    sku: {
      type: 'string',
      label: [{ languageCode: LanguageCode.en, value: 'SKU' }],
      description: [
        {
          languageCode: LanguageCode.en,
          value: 'Matches any product variants with SKUs containing this value',
        },
      ],
    },
  },
  code: 'variant-sku-filter',
  description: [{ languageCode: LanguageCode.en, value: 'Filter by matching SKU' }],

  // This is the function that defines the logic of the filter.
  apply: (qb, args) => {
    const LIKE = qb.connection.options.type === 'postgres' ? 'ILIKE' : 'LIKE';
    return qb.andWhere(`productVariant.sku ${LIKE} :sku`, { sku: `%${args.sku}%` });
  },
});
```

```ts title="Signature"
class CollectionFilter<T extends ConfigArgs = ConfigArgs> extends ConfigurableOperationDef<T> {
    constructor(config: CollectionFilterConfig<T>)
    apply(qb: SelectQueryBuilder<ProductVariant>, args: ConfigArg[]) => SelectQueryBuilder<ProductVariant>;
}
```
* Extends: <DocsLink href="/reference/typescript-api/configurable-operation-def/#configurableoperationdef">`ConfigurableOperationDef`</DocsLink><T>



<div className="members-wrapper">

### constructor

<MemberInfo kind="method" type={`(config: CollectionFilterConfig<T>) => CollectionFilter`}   />


### apply

<MemberInfo kind="method" type={`(qb: SelectQueryBuilder<<a href='/reference/typescript-api/entities/product-variant#productvariant'>ProductVariant</a>>, args: ConfigArg[]) => SelectQueryBuilder<<a href='/reference/typescript-api/entities/product-variant#productvariant'>ProductVariant</a>>`}   />




</div>
