Client
`query`
`order`

order

To order the results of a query, you can use the order method. This method accepts a list of order clauses as an argument. An order clause is a tuple that takes the form [attribute, direction]. direction can be either ASC or DESC. Clauses are applied in the order they are provided.

For example the following query will return all users ordered by their creation date in descending order.

const query = client
  .query('users')
  .select(['id', 'name', 'email', 'dob'])
  .order('created_at', 'DESC');

Clauses can be passed to order as a single clause or an array of clauses:

  • .order('created_at', 'DESC')
  • .order(['created_at', 'DESC'])
  • .order([['created_at', 'DESC']])

You may use dot notation to order by attributes of a record.

const query = client.query('users').order('address.city', 'ASC');

Ordering with relations

If you are using a schema, you can order by attributes of related entities. For example, the following schema defines a relation between users and messages

const schema = {
  users: S.Schema({
    id: S.Id(),
    name: S.String(),
    email: S.String(),
  }),
  messages: S.Schema({
    id: S.Id(),
    text: S.String(),
    created_at: S.Date({ default: S.Default.now() }),
    sender_id: S.String(),
    sender: S.RelationById('users', '$sender_id'),
  }),
};

You can then order messages by the name of the sender.

// Order messages by the name of the sender in ascending order
client.query('messages').order('sender.name', 'ASC');
 
// Order messages by the name of the sender and then by the created date in descending order
client.query('messages').order([
  ['sender.name', 'ASC'],
  ['created_at', 'DESC'],
]);

Ordering with relations is only supported for one-to-one relations, such as RelationById or RelationOne.

After

You may use the after method to specify an entity to start the query from. This is useful for paginating results. You must use order before using after. At the moment, after only supports a single cursor that corresponds to the first order clause.

const PAGE_SIZE = 10;
 
const query = client
  .query('users')
  .select(['id', 'name', 'email', 'dob'])
  .order('created_at', 'DESC')
  .limit(PAGE_SIZE);
 
const { results: firstPage } = client.fetch(query);
const lastEntity = firstPage?.pop();
 
const secondPageQuery = query.after(lastEntity);
const { results: secondPage } = client.fetch(secondPageQuery);