Retrieve documents with expressive URL parameters. Filter by any field, match array contents, resolve references — no SQL, no ORM. It's all expressed in the query string of a plain GET, so there's no client library or query language to learn beyond a small, consistent syntax.
A GET against a whole collection accepts a q parameter made of one or more clauses in the form field:operator:value — or just field:value as shorthand for "equals." The available operators cover the comparisons you'd expect: equals and not-equals, greater/less than (with or without "or equal to"), and in for matching any value in a list. Chain several clauses together with a semicolon and every clause must match, so q=price:gt:10;price:lt:100 narrows results to a price band, and q=status:eq:active;category:in:[books,games] combines an equality check with a list check in one request.
When a field holds an array of objects, the field[*].subfield syntax lets a clause match if any array entry satisfies it — so q=items[*].sku:eq:ABC123 finds records with at least one matching line item. Values are typed automatically (numbers as numbers, dates as dates), so if you need to match a value that merely looks numeric but is stored as text, wrap it in quotes. A malformed filter is rejected outright rather than silently ignored, so a typo in your query surfaces immediately instead of quietly returning the wrong set.
Collections can reference each other, and a query can resolve those references inline instead of requiring a second round trip. Adding resolveRefs={collection} to a read expands the linked documents from that collection directly into the response. You can chain a dot to resolve a second level — for example, pulling in a linked collection's own linked records — or resolve several collections at once with a comma-separated list.