Coreo GraphQL API – Filtering Queries
Most Coreo GraphQL objects are filterable with a where argument. This where argument is a JSON object that specifies the conditions that should be met for the object to be returned.
For example, we can filter the above query to only include data from a single, specific user:
// Get project with id=349 and
// then all records by user with userId=23203
{
project(id: 349) {
id
name
records(
where: {
userId: 23203
}
) {
id
data
userId
}
}
}
This will ensure that the records returned will only be from the user with the id ‘23203’.
This type of filtering should work on every available non Graphql object field (such as
userId,idorname). It is not possible to filter by a child object (GraphQL object, such asrecord), for example, filtering aprojectbased on the contents of the records it contains. However, it is possible to filter by the content of primitive objects, such as thedata, orgeometryfields on a record.
Advanced filtering
The where argument also accepts some more complicated structures which enable advanced filtering on objects.
First of all, a where is not restricted to filtering on one field:
where: {
id: 8306791,
userId: 23203
}
The above query will ensure both conditions are met by the records returned.
For example, if we wanted to filter records that had an id greater than ‘8306791’, we could structure the where as:
where: {
id: {
gt: 8306791
}
}
The result of this query will return all records that have an id greater than 8306791.
If we want to apply multiple filters on the same field we can do so with the and operator, which takes any number of conditions and ensures they are all met:
where: {
and: [
id: {
not: 8306791
},
id: {
gt: 8306780
}
]
}
not is another valid operator that where accepts. The full list of valid operators are listed here:
and: [{ someField: 5 }, { anotherField2: 6 }], // (someField = 5) AND (anotherField = 6)
or: [{ someField: 5 }, { anotherField2: 6 }, // (someField = 5) OR (anotherField = 6)
someField: {
// Basic Operators
.eq: 3, // = 3
ne: 20, // != 20
is: null, // IS NULL
not: true, // IS NOT TRUE
or: [5, 6], // (someAttribute = 5) OR (someAttribute = 6)
// Numeric Operators
gt: 6, // > 6
gte: 6, // >= 6
lt: 10, // < 10
lte: 10, // <= 10
between: [6, 10], // BETWEEN 6 AND 10
notBetween: [11, 15], // NOT BETWEEN 11 AND 15
// Other Operators
in: [1, 2], // IN [1, 2]
notIn: [1, 2], // NOT IN [1, 2]
like: '%hat', // LIKE '%hat'
notLike: '%hat', // NOT LIKE '%hat'
startsWith: 'hat', // LIKE 'hat%'
endsWith: 'hat', // LIKE '%hat'
substring: 'hat', // LIKE '%hat%'
iLike: '%hat', // ILIKE '%hat'
notILike: '%hat', // NOT ILIKE '%hat'
regexp: '^[h|a|t]', // REGEXP/~ '^[h|a|t]'
notRegexp: '^[h|a|t]', // NOT REGEXP/!~ '^[h|a|t]'
iRegexp: '^[h|a|t]', // ~* '^[h|a|t]'
notIRegexp: '^[h|a|t]', // !~* '^[h|a|t]'
any: [2, 3], // ANY ARRAY[2, 3]::INTEGER
// like/iLike/notLike can be combined to Op.any:
like: { any: ['cat', 'hat'] } // LIKE ANY ARRAY['cat', 'hat']
}
Filtering by Data
The data submitted by the user when creating record is stored in the data object of the record. To filter by this, submitted a data object within the where containing the query.
// Find all records where species is cat
{
records(where:{ projectId: 9999, data: { species: 'cat' } } ){
id
data
}
}
// Find all records after a certain timestamp
// As we store timestamps in ISO format we
// can use string comparison with gt (greater-than).
{
records(where:{ projectId: 9999, data: { timestamp: { gt: '2017-07-28T06:40:57.437Z' } } } ){
id
data
}
}