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

  1. Ensure the value is a 2-element array: value: [start, end]
  2. Check range picker components (e.g. Ant Design RangePicker) output and convert to [dayjs/Date, dayjs/Date] pairs
  3. 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

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


AI-assisted analysis of refinedev/refine@779d52a20e (2026-08-27). Data as JSON: /api/errors/8b72fe55a644009a. Report an issue: GitHub.