vault backup: 2026-05-15 16:35:05

This commit is contained in:
Vadym Samoilenko 2026-05-15 16:35:05 +01:00
parent 2d1999e954
commit d1189a2a75
4 changed files with 100 additions and 1 deletions

View file

@ -35,7 +35,7 @@ This 3-hop pattern works for hundreds of articles without vector search.
| [[wiki/reports/_index\|reports/]] | Weekly and monthly summaries — generate: `uv run python scripts/report-generator.py --weekly` | 1 |
| [[wiki/infrastructure/_index\|infrastructure/]] | Server inventory: all 10 SSH hosts — optical, optical-dev, optical-prod, baic, librechat, modocmms, box-cli, aimpress, pve | 12 |
| [[wiki/testing/_index\|testing/]] | Web app testing: functional, performance, security, UI types; TDD/BDD/Agile methodologies; Selenium/Cypress/Playwright/JMeter/OWASP ZAP tools | 1 |
| [[wiki/payloadcms/_index\|payloadcms/]] | Full Payload CMS reference — getting started, config, database (Postgres/MongoDB/SQLite), all 22 field types, access control, hooks, authentication (cookies, JWT, API keys, custom strategies, token data), admin UI, custom components, Lexical rich text, live preview, versions/drafts, Local/REST/GraphQL APIs, queries, plugins, jobs queue, upload, ecommerce, production deploy, TypeScript, migration guides, i18n, localization, hierarchy | 128 |
| [[wiki/payloadcms/_index\|payloadcms/]] | Full Payload CMS reference — getting started, config, database (Postgres/MongoDB/SQLite), all 22 field types, access control, hooks, authentication (cookies, JWT, API keys, custom strategies, token data), admin UI, custom components, Lexical rich text, live preview, versions/drafts, Local/REST/GraphQL APIs, queries, plugins, jobs queue, upload, ecommerce, production deploy, TypeScript, migration guides, i18n, localization, hierarchy | 129 |
| [[wiki/shared-patterns/_index\|shared-patterns/]] | Oliver Agency standard library patterns: httpx, structlog, pydantic-settings, alembic — reuse before writing from scratch | 4 |
| [[wiki/mistakes/_index\|mistakes/]] | Anti-patterns extracted from sessions — per-stack running lists (fastapi, react, docker, postgres, general) — injected at session start | 5 |

View file

@ -129,3 +129,4 @@
| [[wiki/payloadcms/queries-depth\|Queries — Depth (Relationship Population)]] | depth=0 (IDs only) vs depth=N (full objects), defaultDepth config, field-level maxDepth cap, performance notes, GraphQL exception | raw/queries__depth.md | 2026-05-15 |
| [[wiki/payloadcms/queries-pagination\|Queries — Pagination]] | Default pagination (limit/page/pagination options), response shape (docs + metadata), limit:1 perf tip, disabling pagination for bulk ops | raw/queries__pagination.md | 2026-05-15 |
| [[wiki/payloadcms/queries-select\|Queries — Select & Populate]] | Include/exclude field selection at DB level, entity-level `select` function for hooks/access, `defaultPopulate` for relationship optimization, `populate` override | raw/queries__select.md | 2026-05-15 |
| [[wiki/payloadcms/queries-sort\|Queries — Sort]] | Sort by any stored top-level field: `-field` descending, array (Local API) or comma-separated string (REST/GraphQL), index tip | raw/queries__sort.md | 2026-05-15 |

View file

@ -0,0 +1,98 @@
---
title: "Queries — Sort"
aliases: [payload-sort, payload-query-sort]
tags: [payloadcms, queries, sort, api]
sources: [raw/queries__sort.md]
created: 2026-05-15
updated: 2026-05-15
---
## Overview
Documents can be sorted by any **top-level stored field**. Prefix with `-` for descending order; no prefix = ascending.
> **Constraint:** Virtual fields cannot be used for sorting unless [[wiki/payloadcms/fields-relationship|linked with a relationship field]]. The field must exist in the database.
> **Performance:** Enable `index: true` on fields you sort by. See [[wiki/payloadcms/database-indexes|Database Indexes]].
---
## Local API
```ts
// Single field — ascending
const posts = await payload.find({
collection: 'posts',
sort: '-createdAt', // descending
})
// Multiple fields
const posts = await payload.find({
collection: 'posts',
sort: ['priority', '-createdAt'], // array of strings
})
```
---
## REST API
```
GET /api/posts?sort=-createdAt
GET /api/posts?sort=priority,-createdAt // comma-separated
```
Using `qs-esm` query string builder (array form):
```ts
import { stringify } from 'qs-esm'
const query = stringify({ sort: ['priority', '-createdAt'] }, { addQueryPrefix: true })
fetch(`/api/posts${query}`)
```
---
## GraphQL API
```graphql
# Single field
query {
Posts(sort: "-createdAt") {
docs { color }
}
}
# Multiple fields — comma-separated string
query {
Posts(sort: "priority,-createdAt") {
docs { color }
}
}
```
---
## Syntax Summary
| Context | Multiple fields | Descending prefix |
|---------|----------------|-------------------|
| Local API | Array of strings | `-fieldName` |
| REST API | Comma-separated string or array | `-fieldName` |
| GraphQL | Comma-separated string | `-fieldName` |
---
## Key Takeaways
- `-fieldName` = descending; `fieldName` = ascending — works across all three APIs
- Local API accepts an **array**; REST/GraphQL accept a **comma-separated string** (REST also accepts array via qs)
- Only **stored fields** are sortable — virtual fields require a relationship link to be sortable
- Add `index: true` to sort fields for query performance; compound sorts benefit from compound indexes (see [[wiki/payloadcms/database-indexes|Database Indexes]])
- Sort is complementary to [[wiki/payloadcms/queries-pagination|pagination]] and [[wiki/payloadcms/queries-select|select/populate]]
---
## Sources
- `raw/queries__sort.md` — https://payloadcms.com/docs/queries/sort