816 lines
11 KiB
Markdown
816 lines
11 KiB
Markdown
# Filter Operators
|
|
|
|
Used in the filter paramaters of the `find`, `findOne`, `findAndCount`, `count`, etc. APIs of repository:
|
|
|
|
```ts
|
|
const repository = db.getRepository('books');
|
|
|
|
repository.find({
|
|
filter: {
|
|
title: {
|
|
$eq: 'Spring and Autumn',
|
|
}
|
|
}
|
|
});
|
|
```
|
|
|
|
To support JSON, NocoBase identifies query operators as a string prefixed with $.
|
|
|
|
Moreover, NocoBase provides API to extend operators. Refer to [`db.registerOperators()`](../database#registeroperators).
|
|
|
|
## General Operators
|
|
|
|
### `$eq`
|
|
|
|
Check if the field value is equal to the specified value. Equivalent to `=` in SQL.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
title: {
|
|
$eq: 'Spring and Autumn',
|
|
}
|
|
}
|
|
});
|
|
```
|
|
|
|
Equal to `title: 'Spring and Autumn'`
|
|
|
|
### `$ne`
|
|
|
|
Check if the field value is not equal to the specified value. Equivalent to `!=` in SQL.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
title: {
|
|
$ne: 'Spring and Autumn',
|
|
}
|
|
}
|
|
});
|
|
```
|
|
|
|
### `$is`
|
|
|
|
Check if the field value is the specified value. Equivalent to `IS` in SQL.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
title: {
|
|
$is: null,
|
|
}
|
|
}
|
|
});
|
|
```
|
|
|
|
### `$not`
|
|
|
|
Check if the field value is not the specified value. Equivalent to `IS NOT` in SQL.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
title: {
|
|
$not: null,
|
|
}
|
|
}
|
|
});
|
|
```
|
|
|
|
### `$col`
|
|
|
|
Check if the field value is equal to the value of another field. Equivalent to `=` in SQL.
|
|
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
title: {
|
|
$col: 'name',
|
|
}
|
|
}
|
|
});
|
|
```
|
|
|
|
### `$in`
|
|
|
|
Check if the field value is in the specified array. Equivalent to `IN` in SQL.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
title: {
|
|
$in: ['Spring and Autumn', 'Warring States'],
|
|
}
|
|
}
|
|
});
|
|
```
|
|
|
|
### `$notIn`
|
|
|
|
Check if the field value is not in the specified array. Equivalent to `NOT IN` in SQL.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
title: {
|
|
$notIn: ['Spring and Autumn', 'Warring States'],
|
|
}
|
|
}
|
|
});
|
|
```
|
|
|
|
### `$empty`
|
|
|
|
Check if the general field is empty. For string field, check if it is an empty string; for array field, check if it is an empty array.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
title: {
|
|
$empty: true,
|
|
}
|
|
}
|
|
});
|
|
```
|
|
|
|
### `$notEmpty`
|
|
|
|
Check if the general field is not empty. For string field, check if it is not an empty string; for array field, check if it is not an empty array.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
title: {
|
|
$notEmpty: true,
|
|
}
|
|
}
|
|
});
|
|
```
|
|
|
|
## Logical Operators
|
|
|
|
### `$and`
|
|
|
|
Logical AND. Equivalent to `AND` in SQL.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
$and: [
|
|
{ title: 'Book of Songs' },
|
|
{ isbn: '1234567890' },
|
|
]
|
|
}
|
|
});
|
|
```
|
|
|
|
### `$or`
|
|
|
|
Logical OR. Equivalent to `OR` in SQL.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
$or: [
|
|
{ title: 'Book of Songs' },
|
|
{ publishedAt: { $lt: '0000-00-00T00:00:00Z' } },
|
|
]
|
|
}
|
|
});
|
|
```
|
|
|
|
## Boolean Field Operators
|
|
|
|
For boolean fields: `type: 'boolean'`
|
|
|
|
### `$isFalsy`
|
|
|
|
Check if a Boolean field value is false. Boolean field values of `false`, `0` and `NULL` are all judged to be `$isFalsy: true`.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
isPublished: {
|
|
$isFalsy: true,
|
|
}
|
|
}
|
|
})
|
|
```
|
|
|
|
### `$isTruly`
|
|
|
|
Check if a Boolean field value is true. Boolean field values of `true` and `1` are all judged to be `$isTruly: true`.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
isPublished: {
|
|
$isTruly: true,
|
|
}
|
|
}
|
|
})
|
|
```
|
|
|
|
## Numeric Type Field Operators
|
|
|
|
For numeric type fields, including:
|
|
|
|
- `type: 'integer'`
|
|
- `type: 'float'`
|
|
- `type: 'double'`
|
|
- `type: 'real'`
|
|
- `type: 'decimal'`
|
|
|
|
### `$gt`
|
|
|
|
Check if the field value is greater than the specified value. Equivalent to `>` in SQL.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
price: {
|
|
$gt: 100,
|
|
}
|
|
}
|
|
});
|
|
```
|
|
|
|
### `$gte`
|
|
|
|
Check if the field value is equal to or greater than the specified value. Equivalent to `>=` in SQL.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
price: {
|
|
$gte: 100,
|
|
}
|
|
}
|
|
});
|
|
```
|
|
|
|
### `$lt`
|
|
|
|
Check if the field value is less than the specified value. Equivalent to `<` in SQL.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
price: {
|
|
$lt: 100,
|
|
}
|
|
}
|
|
});
|
|
```
|
|
|
|
### `$lte`
|
|
|
|
Check if the field value is equal to or less than the specified value. Equivalent to `<=` in SQL.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
price: {
|
|
$lte: 100,
|
|
}
|
|
}
|
|
});
|
|
```
|
|
|
|
### `$between`
|
|
|
|
Check if the field value is between the specified two values. Equivalent to `BETWEEN` in SQL.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
price: {
|
|
$between: [100, 200],
|
|
}
|
|
}
|
|
});
|
|
```
|
|
|
|
### `$notBetween`
|
|
|
|
Check if the field value is not between the specified two values. Equivalent to `NOT BETWEEN` in SQL.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
price: {
|
|
$notBetween: [100, 200],
|
|
}
|
|
}
|
|
});
|
|
```
|
|
|
|
## String Type Field Operators
|
|
|
|
For string type fields, including `string`.
|
|
|
|
### `$includes`
|
|
|
|
Check if the string field contains the specified substring.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
title: {
|
|
$includes: 'Three Character Classic',
|
|
}
|
|
}
|
|
})
|
|
```
|
|
|
|
### `$notIncludes`
|
|
|
|
Check if the string field does not contain the specified substring.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
title: {
|
|
$notIncludes: 'Three Character Classic',
|
|
}
|
|
}
|
|
})
|
|
```
|
|
|
|
### `$startsWith`
|
|
|
|
Check if the string field starts with the specified substring.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
title: {
|
|
$startsWith: 'Three Character Classic',
|
|
}
|
|
}
|
|
})
|
|
```
|
|
|
|
### `$notStatsWith`
|
|
|
|
Check if the string field does not start with the specified substring.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
title: {
|
|
$notStatsWith: 'Three Character Classic',
|
|
}
|
|
}
|
|
})
|
|
```
|
|
|
|
### `$endsWith`
|
|
|
|
Check if the string field ends with the specified substring.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
title: {
|
|
$endsWith: 'Three Character Classic',
|
|
}
|
|
}
|
|
})
|
|
```
|
|
|
|
### `$notEndsWith`
|
|
|
|
Check if the string field does not end with the specified substring.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
title: {
|
|
$notEndsWith: 'Three Character Classic',
|
|
}
|
|
}
|
|
})
|
|
```
|
|
|
|
### `$like`
|
|
|
|
Check if the field value contains the specified string. Equivalent to `LIKE` in SQL.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
title: {
|
|
$like: 'Computer',
|
|
}
|
|
}
|
|
});
|
|
```
|
|
|
|
### `$notLike`
|
|
|
|
Check if the field value does not contain the specified string. Equivalent to `NOT LIKE` in SQL.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
title: {
|
|
$notLike: 'Computer',
|
|
}
|
|
}
|
|
});
|
|
```
|
|
|
|
### `$iLike`
|
|
|
|
Check if a field value contains the specified string, case ignored. Equivalent to `ILIKE` in SQL (PG only).
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
title: {
|
|
$iLike: 'Computer',
|
|
}
|
|
}
|
|
});
|
|
```
|
|
|
|
### `$notILike`
|
|
|
|
Check if a field value does not contain the specified string, case ignored. Equivalent to `NOT ILIKE` in SQL (PG only).
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
title: {
|
|
$notILike: 'Computer',
|
|
}
|
|
}
|
|
});
|
|
```
|
|
|
|
### `$regexp`
|
|
|
|
Check if the field value matches the specified regular expression. Equivalent to `REGEXP` in SQL (PG only).
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
title: {
|
|
$regexp: '^Computer',
|
|
}
|
|
}
|
|
});
|
|
```
|
|
|
|
### `$notRegexp`
|
|
|
|
Check if the field value does not matche the specified regular expression. Equivalent to `NOT REGEXP` in SQL (PG only).
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
title: {
|
|
$notRegexp: '^Computer',
|
|
}
|
|
}
|
|
});
|
|
```
|
|
|
|
### `$iRegexp`
|
|
|
|
Check if the field value matches the specified regular expression, case ignored. Equivalent to `~*` in SQL (PG only).
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
title: {
|
|
$iRegexp: '^COMPUTER',
|
|
}
|
|
}
|
|
});
|
|
```
|
|
|
|
### `$notIRegexp`
|
|
|
|
Check if the field value does not matche the specified regular expression, case ignored. Equivalent to `!~*` in SQL (PG only).
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
title: {
|
|
$notIRegexp: '^COMPUTER',
|
|
}
|
|
}
|
|
});
|
|
```
|
|
|
|
## Date Type Field Operators
|
|
|
|
For date type fields: `type: 'date'`
|
|
|
|
### `$dateOn`
|
|
|
|
Check if the date field value is within a certain day.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
createdAt: {
|
|
$dateOn: '2021-01-01',
|
|
}
|
|
}
|
|
})
|
|
```
|
|
|
|
### `$dateNotOn`
|
|
|
|
Check if the date field value is not within a certain day.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
createdAt: {
|
|
$dateNotOn: '2021-01-01',
|
|
}
|
|
}
|
|
})
|
|
```
|
|
|
|
### `$dateBefore`
|
|
|
|
Check if the date field value is before a certain value, i.e. less than the one passed in.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
createdAt: {
|
|
$dateBefore: '2021-01-01T00:00:00.000Z',
|
|
}
|
|
}
|
|
})
|
|
```
|
|
|
|
### `$dateNotBefore`
|
|
|
|
Check if the date field value is not before a certain value, i.e. equal to or greater than the one passed in.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
createdAt: {
|
|
$dateNotBefore: '2021-01-01T00:00:00.000Z',
|
|
}
|
|
}
|
|
})
|
|
```
|
|
|
|
### `$dateAfter`
|
|
|
|
Check if the date field value is after a certain value, i.e. greater than the one passed in.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
createdAt: {
|
|
$dateAfter: '2021-01-01T00:00:00.000Z',
|
|
}
|
|
}
|
|
})
|
|
```
|
|
|
|
### `$dateNotAfter`
|
|
|
|
Check if the date field value is not after a certain value, i.e. equal to or greater than the one passed in.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
createdAt: {
|
|
$dateNotAfter: '2021-01-01T00:00:00.000Z',
|
|
}
|
|
}
|
|
})
|
|
```
|
|
|
|
## Array Type Field Operators
|
|
|
|
For array type fields: `type: 'array'`
|
|
|
|
### `$match`
|
|
|
|
Check if the array field values match values of the specified array.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
tags: {
|
|
$match: ['literature', 'history'],
|
|
}
|
|
}
|
|
})
|
|
```
|
|
|
|
### `$notMatch`
|
|
|
|
Check if the array field values do not match values of the specified array.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
tags: {
|
|
$notMatch: ['literature', 'history'],
|
|
}
|
|
}
|
|
})
|
|
```
|
|
|
|
### `$anyOf`
|
|
|
|
Check if the array field values contain any of the values of the specified array.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
tags: {
|
|
$anyOf: ['literature', 'history'],
|
|
}
|
|
}
|
|
})
|
|
```
|
|
|
|
### `$noneOf`
|
|
|
|
Check if the array field values contain none of the values of the specified array.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
tags: {
|
|
$noneOf: ['literature', 'history'],
|
|
}
|
|
}
|
|
})
|
|
```
|
|
|
|
### `$arrayEmpty`
|
|
|
|
Check if the array field is empty.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
tags: {
|
|
$arrayEmpty: true,
|
|
}
|
|
}
|
|
});
|
|
```
|
|
|
|
### `$arrayNotEmpty`
|
|
|
|
Check if the array field is not empty.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
tags: {
|
|
$arrayNotEmpty: true,
|
|
}
|
|
}
|
|
});
|
|
```
|
|
|
|
## Relational Field Type Operators
|
|
|
|
For checking if a relationship exists, field types include:
|
|
|
|
- `type: 'hasOne'`
|
|
- `type: 'hasMany'`
|
|
- `type: 'belongsTo'`
|
|
- `type: 'belongsToMany'`
|
|
|
|
### `$exists`
|
|
|
|
There is relational data existing.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
author: {
|
|
$exists: true,
|
|
}
|
|
}
|
|
});
|
|
```
|
|
|
|
### `$notExists`
|
|
|
|
There is no relational data existing.
|
|
|
|
**Example**
|
|
|
|
```ts
|
|
repository.find({
|
|
filter: {
|
|
author: {
|
|
$notExists: true,
|
|
}
|
|
}
|
|
});
|
|
```
|