refinedev/refine · error · Error
Value array must contain exactly two elements for "between"
Error message
Value array must contain exactly two elements for "between" operator
What it means
The Appwrite data provider requires the 'between' filter operator's value to be an array of exactly two elements (start and end) so it can map to Appwrite's Query.between(field, start, end). Any other shape throws this error.
Source
Thrown at packages/appwrite/src/utils/generateFilter.ts:38
switch (filter.operator) {
// Logical operators
case "eq":
return Query.equal(filter.field, filter.value);
case "ne":
return Query.notEqual(filter.field, filter.value);
case "gt":
return Query.greaterThan(filter.field, filter.value);
case "gte":
return Query.greaterThanEqual(filter.field, filter.value);
case "lt":
return Query.lessThan(filter.field, filter.value);
case "lte":
return Query.lessThanEqual(filter.field, filter.value);
case "contains":
return Query.search(filter.field, `%${filter.value}%`);
case "between":
if (!Array.isArray(filter.value) || filter.value.length !== 2) {
throw new Error(
`Value array must contain exactly two elements for "between" operator`,
);
}
return Query.between(filter.field, filter.value[0], filter.value[1]);
case "null":
return Query.isNull(filter.field);
case "nnull":
return Query.isNotNull(filter.field);
case "startswith":
return Query.startsWith(filter.field, filter.value);
case "endswith":
return Query.endsWith(filter.field, filter.value);
// Conditional operators
case "or":
if (filter.value.length === 1 && filter.value[0]) {
//? "OR" queries require at least two queries in Appwrite
return generateFilter(filter.value[0], nextDeep);View on GitHub (pinned to 779d52a20e)
Solutions
- Ensure the value is a 2-element array: value: [start, end]
- Check range picker components (e.g. Ant Design RangePicker) output and convert to [dayjs/Date, dayjs/Date] pairs
- Validate filter shape before calling the data provider
Example fix
// before
filters: [{ field: 'createdAt', operator: 'between', value: '2023-01-01,2023-12-31' }]
// after
filters: [{ field: 'createdAt', operator: 'between', value: ['2023-01-01', '2023-12-31'] }] Defensive patterns
Strategy: validation
Validate before calling
const ok = f.operator === 'between' && Array.isArray(f.value) && f.value.length === 2;
if (!ok) throw new Error('between requires [start, end]'); Type guard
const isBetweenPair = (v: unknown): v is [unknown, unknown] => Array.isArray(v) && v.length === 2;
Prevention
- Normalize range-picker output to 2-element arrays before use
- Type filters as CrudFilter so TS catches wrong value shapes
When it happens
Trigger: Using filters: [{ field: 'age', operator: 'between', value: 18 }] or value: [1,2,3], or value: 'a,b' — i.e. anything but a 2-element array.
Common situations: Copy-pasting filter values from a UI date-range/number-range component that emits a string, an object, or an array with empty entries; migrating filters from another data provider with different 'between' conventions.
Related errors
- Max deep reached
- Operator ${filter.operator} is not supported
- Operator ${operator} is not supported
- Invalid provider: ${providerId}
- Invalid action type
AI-assisted analysis of refinedev/refine@779d52a20e (2026-08-27).
Data as JSON: /api/errors/8b72fe55a644009a.
Report an issue: GitHub.