Documents
filters
filters
Type
External
Status
Published
Created
Mar 5, 2026
Updated
Mar 5, 2026

import DeepFilteringBlogLink from '/docs/snippets/deep-filtering-blog.md'

Document Service API: Filters#

The Document Service API offers the ability to filter results.

The following operators are available:

OperatorDescription
$eqEqual
$eqiEqual (case-insensitive)
$neNot equal
$neiNot equal (case-insensitive)
$ltLess than
$lteLess than or equal to
$gtGreater than
$gteGreater than or equal to
$inIncluded in an array
$notInNot included in an array
$containsContains
$notContainsDoes not contain
$containsiContains (case-insensitive)
$notContainsiDoes not contain (case-insensitive)
$nullIs null
$notNullIs not null
$betweenIs between
$startsWithStarts with
$startsWithiStarts with (case-insensitive)
$endsWithEnds with
$endsWithiEnds with (case-insensitive)
$orJoins the filters in an "or" expression
$andJoins the filters in an "and" expression
$notJoins the filters in an "not" expression

Attribute operators#


$not#

Negates the nested condition(s).

Example

const entries = await strapi.documents('api::article.article').findMany({
  filters: {
    title: {
      $not: {
        $contains: 'Hello World',
      },
    },
  },
});

$eq#

Attribute equals input value.

Example

const entries = await strapi.documents('api::article.article').findMany({
  filters: {
    title: {
      $eq: 'Hello World',
    },
  },
});

$eq can be omitted:

const entries = await strapi.documents('api::article.article').findMany({
  filters: {
    title: 'Hello World',
  },
});

$eqi#

Attribute equals input value (case-insensitive).

Example

const entries = await strapi.documents('api::article.article').findMany({
  filters: {
    title: {
      $eqi: 'HELLO World',
    },
  },
});

$ne#

Attribute does not equal input value.

Example

const entries = await strapi.documents('api::article.article').findMany({
  filters: {
    title: {
      $ne: 'ABCD',
    },
  },
});

$nei#

Attribute does not equal input value (case-insensitive).

Example

const entries = await strapi.documents('api::article.article').findMany({
  filters: {
    title: {
      $nei: 'abcd',
    },
  },
});

$in#

Attribute is contained in the input list.

Example

const entries = await strapi.documents('api::article.article').findMany({
  filters: {
    title: {
      $in: ['Hello', 'Hola', 'Bonjour'],
    },
  },
});

$in can be omitted when passing an array of values:

const entries = await strapi.documents('api::article.article').findMany({
  filters: {
    title: ['Hello', 'Hola', 'Bonjour'],
  },
});

$notIn#

Attribute is not contained in the input list.

Example

const entries = await strapi.documents('api::article.article').findMany({
  filters: {
    title: {
      $notIn: ['Hello', 'Hola', 'Bonjour'],
    },
  },
});

$lt#

Attribute is less than the input value.

Example

const entries = await strapi.documents('api::article.article').findMany({
  filters: {
    rating: {
      $lt: 10,
    },
  },
});

$lte#

Attribute is less than or equal to the input value.

Example

const entries = await strapi.documents('api::article.article').findMany({
  filters: {
    rating: {
      $lte: 10,
    },
  },
});

$gt#

Attribute is greater than the input value.

Example

const entries = await strapi.documents('api::article.article').findMany({
  filters: {
    rating: {
      $gt: 5,
    },
  },
});

$gte#

Attribute is greater than or equal to the input value.

Example

const entries = await strapi.documents('api::article.article').findMany({
  filters: {
    rating: {
      $gte: 5,
    },
  },
});

$between#

Attribute is between the 2 input values, boundaries included (e.g., $between[1, 3] will also return 1 and 3).

Example

const entries = await strapi.documents('api::article.article').findMany({
  filters: {
    rating: {
      $between: [1, 20],
    },
  },
});

$contains#

Attribute contains the input value (case-sensitive).

Example

const entries = await strapi.documents('api::article.article').findMany({
  filters: {
    title: {
      $contains: 'Hello',
    },
  },
});

$notContains#

Attribute does not contain the input value (case-sensitive).

Example

const entries = await strapi.documents('api::article.article').findMany({
  filters: {
    title: {
      $notContains: 'Hello',
    },
  },
});

$containsi#

Attribute contains the input value. $containsi is not case-sensitive, while $contains is.

Example

const entries = await strapi.documents('api::article.article').findMany({
  filters: {
    title: {
      $containsi: 'hello',
    },
  },
});

$notContainsi#

Attribute does not contain the input value. $notContainsi is not case-sensitive, while $notContains is.

Example

const entries = await strapi.documents('api::article.article').findMany({
  filters: {
    title: {
      $notContainsi: 'hello',
    },
  },
});

$startsWith#

Attribute starts with input value (case-sensitive).

Example

const entries = await strapi.documents('api::article.article').findMany({
  filters: {
    title: {
      $startsWith: 'ABCD',
    },
  },
});

$startsWithi#

Attribute starts with input value (case-insensitive).

Example

const entries = await strapi.documents('api::article.article').findMany({
  filters: {
    title: {
      $startsWithi: 'ABCD', // will return the same as filtering with 'abcd'
    },
  },
});

$endsWith#

Attribute ends with input value (case-sensitive).

Example

const entries = await strapi.documents('api::article.article').findMany({
  filters: {
    title: {
      $endsWith: 'ABCD',
    },
  },
});

$endsWithi#

Attribute ends with input value (case-insensitive).

Example

const entries = await strapi.documents('api::article.article').findMany({
  filters: {
    title: {
      $endsWith: 'ABCD', // will return the same as filtering with 'abcd'
    },
    },
  },
});

$null#

Attribute is null.

Example

const entries = await strapi.documents('api::article.article').findMany({
  filters: {
    title: {
      $null: true,
    },
  },
});

$notNull#

Attribute is not null.

Example

const entries = await strapi.documents('api::article.article').findMany({
  filters: {
    title: {
      $notNull: true,
    },
  },
});

Logical operators#

$and#

All nested conditions must be true.

Example

const entries = await strapi.documents('api::article.article').findMany({
  filters: {
    $and: [
      {
        title: 'Hello World',
      },
      {
        createdAt: { $gt: '2021-11-17T14:28:25.843Z' },
      },
    ],
  },
});

$and will be used implicitly when passing an object with nested conditions:

const entries = await strapi.documents('api::article.article').findMany({
  filters: {
    title: 'Hello World',
    createdAt: { $gt: '2021-11-17T14:28:25.843Z' },
  },
});

$or#

One or many nested conditions must be true.

Example

const entries = await strapi.documents('api::article.article').findMany({
  filters: {
    $or: [
      {
        title: 'Hello World',
      },
      {
        createdAt: { $gt: '2021-11-17T14:28:25.843Z' },
      },
    ],
  },
});

$not#

Negates the nested conditions.

Example

const entries = await strapi.documents('api::article.article').findMany({
  filters: {
    $not: {
      title: 'Hello World',
    },
  },
});