Simplify your stack and build anything. Or everything.
Build tomorrow’s web with a modern solution you truly own.
Code-based nature means you can build on top of it to power anything.
It’s time to take back your content infrastructure.

Querying your Documents

In Payload, "querying" means filtering or searching through Documents within a Collection. The querying language in Payload is designed to be simple and powerful, allowing you to filter Documents with extreme precision through an intuitive and standardized structure.

Payload provides three common APIs for querying your data:

  • Local API - Extremely fast, direct-to-database access
  • REST API - Standard HTTP endpoints for querying and mutating data
  • GraphQL - A full GraphQL API with a GraphQL Playground

Each of these APIs share the same underlying querying language, and fully support all of the same features. This means that you can learn Payload's querying language once, and use it across any of the APIs that you might use.

To query your Documents, you can send any number of Operators through your request:

1
import type { Where } from 'payload'
2
3
const query: Where = {
4
color: {
5
equals: 'blue',
6
},
7
}

The exact query syntax will depend on the API you are using, but the concepts are the same across all APIs. More details.

Operators

The following operators are available for use in queries:

OperatorDescription
equalsThe value must be exactly equal.
not_equalsThe query will return all documents where the value is not equal.
greater_thanFor numeric or date-based fields.
greater_than_equalFor numeric or date-based fields.
less_thanFor numeric or date-based fields.
less_than_equalFor numeric or date-based fields.
likeCase-insensitive string must be present. If string of words, all words must be present, in any order.
containsMust contain the value entered, case-insensitive.
inThe value must be found within the provided comma-delimited list of values.
not_inThe value must NOT be within the provided comma-delimited list of values.
allThe value must contain all values provided in the comma-delimited list.
existsOnly return documents where the value either exists (true) or does not exist (false).
nearFor distance related to a Point Field comma separated as <longitude>, <latitude>, <maxDistance in meters (nullable)>, <minDistance in meters (nullable)>.
withinFor Point Fields to filter documents based on whether points are inside of the given area defined in GeoJSON. Example
intersectsFor Point Fields to filter documents based on whether points intersect with the given area defined in GeoJSON. Example

And / Or Logic

In addition to defining simple queries, you can join multiple queries together using AND / OR logic. These can be nested as deeply as you need to create complex queries.

To join queries, use the and or or keys in your query object:

1
import type { Where } from 'payload'
2
3
const query: Where = {
4
or: [
5
{
6
color: {
7
equals: 'mint',
8
},
9
},
10
{
11
and: [
12
{
13
color: {
14
equals: 'white',
15
},
16
},
17
{
18
featured: {
19
equals: false,
20
},
21
},
22
],
23
},
24
],
25
}

Written in plain English, if the above query were passed to a find operation, it would translate to finding posts where either the color is mint OR the color is white AND featured is set to false.

Nested properties

When working with nested properties, which can happen when using relational fields, it is possible to use the dot notation to access the nested property. For example, when working with a Song collection that has a artists field which is related to an Artists collection using the name: 'artists'. You can access a property within the collection Artists like so:

1
import type { Where } from 'payload'
2
3
const query: Where = {
4
'artists.featured': {
5
// nested property name to filter on
6
exists: true, // operator to use and boolean value that needs to be true
7
},
8
}

Writing Queries

Writing queries in Payload is simple and consistent across all APIs, with only minor differences in syntax between them.

Local API

The Local API supports the find operation that accepts a raw query object:

1
import type { Payload } from 'payload'
2
3
const getPosts = async (payload: Payload) => {
4
const posts = await payload.find({
5
collection: 'posts',
6
where: {
7
color: {
8
equals: 'mint',
9
},
10
},
11
})
12
13
return posts
14
}

GraphQL API

All find queries in the GraphQL API support the where argument that accepts a raw query object:

1
query {
2
Posts(where: { color: { equals: mint } }) {
3
docs {
4
color
5
}
6
totalDocs
7
}
8
}

REST API

With the REST API, you can use the full power of Payload queries, but they are written as query strings instead:

https://localhost:3000/api/posts?where[color][equals]=mint

To understand the syntax, you need to understand that complex URL search strings are parsed into a JSON object. This one isn't too bad, but more complex queries get unavoidably more difficult to write.

For this reason, we recommend to use the extremely helpful and ubiquitous qs-esm package to parse your JSON / object-formatted queries into query strings:

1
import { stringify } from 'qs-esm'
2
import type { Where } from 'payload'
3
4
const query: Where = {
5
color: {
6
equals: 'mint',
7
},
8
// This query could be much more complex
9
// and qs-esm would handle it beautifully
10
}
11
12
const getPosts = async () => {
13
const stringifiedQuery = stringify(
14
{
15
where: query, // ensure that `qs-esm` adds the `where` property, too!
16
},
17
{ addQueryPrefix: true },
18
)
19
20
const response = await fetch(`http://localhost:3000/api/posts${stringifiedQuery}`)
21
// Continue to handle the response below...
22
}
Next

Sort