voyageai-cli
Version:
CLI for Voyage AI embeddings, reranking, and MongoDB Atlas Vector Search
157 lines (97 loc) • 3.49 kB
Markdown
# Filtering
Filtering narrows results to specific criteria using query parameters. The platform supports flexible filter syntax for simple and complex queries.
## Basic Filtering
Filter by a single field:
```
GET /users?filter[status]=active
```
Returns only users with `status` equal to "active". Multiple filters combine with AND logic:
```
GET /users?filter[status]=active&filter[role]=admin
```
Returns users with `status=active` AND `role=admin`.
## Comparison Operators
Use operators for more complex filtering:
```
GET /events?filter[created_at][$gte]=2026-01-01
```
Supported operators:
- `$eq` - Equal (default if no operator specified)
- `$ne` - Not equal
- `$gt` - Greater than
- `$gte` - Greater than or equal
- `$lt` - Less than
- `$lte` - Less than or equal
- `$in` - In array
- `$nin` - Not in array
- `$exists` - Field exists (true) or is null (false)
## Range Queries
Query ranges with multiple operators:
```
GET /products?filter[price][$gte]=10&filter[price][$lte]=100
```
Returns products priced between $10 and $100 inclusive.
## String Matching
**Exact match**: `filter[name]=John`
**Partial match (contains)**: `filter[name][$contains]=ohn` (matches "John", "Johnson", etc.)
**Case-insensitive**: `filter[name][$icontains]=JOHN` (matches "john", "John", "JOHN")
**Regex**: `filter[email][$regex]=^[a-z]+@example\.com$` (limited to patterns for performance)
## Array Filtering
Filter by array membership:
```
GET /users?filter[tags][$in]=vip,premium
```
Returns users with tags containing "vip" or "premium".
Filter array length:
```
GET /users?filter[tags][$size]=3
```
Returns users with exactly 3 tags.
## Nested Object Filtering
For nested objects, use dot notation:
```
GET /orders?filter[user.status]=active
```
Filters by the `status` field inside the nested `user` object.
## Date and Time Filtering
Dates can be specified in ISO 8601 format:
```
GET /events?filter[timestamp][$gte]=2026-02-01T00:00:00Z
```
Shorthand for day-only:
```
GET /events?filter[date][$gte]=2026-02-01
```
Interpreted as 2026-02-01T00:00:00Z.
Relative dates (future enhancement):
```
GET /events?filter[created_at][$gte]=now-7d
```
Not yet supported; use absolute dates instead.
## Boolean Filtering
```
GET /users?filter[verified]=true&filter[deleted]=false
```
## Multiple OR Conditions
OR logic uses separate filter arrays:
```
GET /users?filter[$or][0][status]=active&filter[$or][0][status]=pending
```
Returns users with `status` equal to "active" OR "pending".
## Filter Limits
Filters are powerful but resource-intensive. Complex filters with >10 conditions or deep nesting may be slow. Use strategically and consider denormalization in your database schema.
## Full-Text Search
For keyword-based search, use `search` parameter instead of filters:
```
GET /articles?search=kubernetes+deployment
```
This searches across multiple text fields efficiently using full-text indexes.
## Filter Performance
Indexes are important for filter performance. Common filtered fields should be indexed. Check the [Schema Documentation](../database/schema-overview.md) for available indexes.
Queries without indexes on filtered fields run slower, especially on large tables. Monitor slow query logs to identify missing indexes.
## Combining Filters with Pagination
Filters reduce results before pagination:
```
GET /users?filter[status]=active&page=2&per_page=50
```
The `total` count in pagination metadata reflects filtered results.