Skip to main content

Queries

PomegranateDB provides a fluent query builder for constructing type-safe database queries.

Basic Queries

const posts = await db.get(Post)
.query()
.where('status', 'published')
.fetch();

The two-argument form of where uses equality by default:

.where('status', 'published')
// equivalent to:
.where('status', 'eq', 'published')

Comparison Operators

OperatorMeaningExample
eqEqual.where('status', 'eq', 'draft')
neqNot equal.where('status', 'neq', 'deleted')
gtGreater than.where('count', 'gt', 10)
gteGreater or equal.where('count', 'gte', 10)
ltLess than.where('count', 'lt', 100)
lteLess or equal.where('count', 'lte', 100)
inIn array.where('status', 'in', ['draft', 'review'])
notInNot in array.where('status', 'notIn', ['deleted'])
likeSQL LIKE.where('title', 'like', '%react%')
notLikeSQL NOT LIKE.where('title', 'notLike', '%test%')
betweenBetween range.where('count', 'between', [10, 100])
isNullIs null.where('deletedAt', 'isNull', true)
isNotNullIs not null.where('title', 'isNotNull', true)

Compound Conditions

AND

const results = await db.get(Post)
.query()
.where('status', 'published')
.where('viewCount', 'gt', 100) // implicit AND
.fetch();

For explicit grouping:

.and((q) => {
q.where('status', 'published');
q.where('viewCount', 'gt', 100);
})

OR

const results = await db.get(Post)
.query()
.or((q) => {
q.where('status', 'draft');
q.where('status', 'review');
})
.fetch();

Nesting

Combine and and or for complex conditions:

const results = await db.get(Post)
.query()
.where('isPublished', true)
.or((q) => {
q.where('viewCount', 'gt', 1000);
q.and((inner) => {
inner.where('status', 'featured');
inner.where('createdAt', 'gt', lastWeek);
});
})
.fetch();

Sorting

.orderBy('created_at', 'desc')
.orderBy('title', 'asc')

Multiple orderBy calls chain — first by created_at descending, then by title ascending.

Pagination

.limit(20)    // max 20 results
.offset(40) // skip first 40 results

Count

const count = await db.get(Post)
.query()
.where('status', 'published')
.count();

Observing Queries

Subscribe to live query results with observe():

const observable = db.get(Post)
.query()
.where('status', 'published')
.observe();

const unsubscribe = observable.subscribe((posts) => {
console.log('Published posts:', posts.length);
});

The observable emits a new result set whenever the underlying data changes.

See React Hooks for ergonomic React integration.

const results = await db.get(Post).search({
query: 'react native database',
columns: ['title', 'body'],
limit: 50,
});

Search uses SQL LIKE with %term% matching by default. Each search term must match at least one of the specified columns.