VibORM
Filtering

Array Filters

Filter operators for array fields

Array Filters

Filter operators available for array fields (PostgreSQL only).

Array fields are only supported in PostgreSQL. MySQL and SQLite don't have native array types.

Operators

OperatorDescription
hasArray contains value
hasEveryArray contains all values
hasSomeArray contains any value
isEmptyArray is empty
equalsExact array match

has

Check if array contains a single value:

// Has "featured" tag
where: {
  tags: { has: "featured" },
}

// Has specific role
where: {
  roles: { has: "ADMIN" },
}

hasEvery

Check if array contains ALL specified values:

// Has both "tech" and "tutorial"
where: {
  tags: { hasEvery: ["tech", "tutorial"] },
}

// User has all required permissions
where: {
  permissions: { hasEvery: ["read", "write", "delete"] },
}

hasSome

Check if array contains ANY of the specified values:

// Has "tech" OR "science" OR "programming"
where: {
  tags: { hasSome: ["tech", "science", "programming"] },
}

// User has at least one admin permission
where: {
  permissions: { hasSome: ["admin", "superuser"] },
}

isEmpty

Check if array is empty:

// No tags
where: {
  tags: { isEmpty: true },
}

// Has at least one tag
where: {
  tags: { isEmpty: false },
}

equals

Exact array match (order matters):

// Exactly these tags in this order
where: {
  tags: { equals: ["featured", "top"] },
}

Examples

Tagged Content

async function getPostsByTag(tag: string) {
  return client.post.findMany({
    where: {
      tags: { has: tag },
      published: true,
    },
  });
}

Multiple Tags

async function getPostsWithAllTags(tags: string[]) {
  return client.post.findMany({
    where: {
      tags: { hasEvery: tags },
    },
  });
}

async function getPostsWithAnyTag(tags: string[]) {
  return client.post.findMany({
    where: {
      tags: { hasSome: tags },
    },
  });
}

Permission Check

async function getUsersWithPermission(permission: string) {
  return client.user.findMany({
    where: {
      permissions: { has: permission },
    },
  });
}

async function getUsersWithAllPermissions(permissions: string[]) {
  return client.user.findMany({
    where: {
      permissions: { hasEvery: permissions },
    },
  });
}

Untagged Content

async function getUntaggedPosts() {
  return client.post.findMany({
    where: {
      tags: { isEmpty: true },
    },
  });
}

Role-Based Access

async function getAdminUsers() {
  return client.user.findMany({
    where: {
      roles: { hasSome: ["ADMIN", "SUPERADMIN"] },
    },
  });
}

Updating Arrays

// Add to array
await client.post.update({
  where: { id: "post_123" },
  data: {
    tags: { push: "new-tag" },
  },
});

// Set entire array
await client.post.update({
  where: { id: "post_123" },
  data: {
    tags: { set: ["tag1", "tag2", "tag3"] },
  },
});

Alternative for MySQL/SQLite

Use JSON arrays instead of native arrays:

// Schema
const post = s.model({
  id: s.string().id(),
  tags: s.json().default([]),  // JSON array
});

// Query with JSON operators
where: {
  tags: {
    array_contains: "featured",
  },
}

On this page