# Entities overview

> How tables are declared, stored and queried.


An entity is a table. Declare one by adding a JSON file to `draftship/entities/`, named in kebab-case (`team-member.json` for `TeamMember`). Schemas are applied after each successful build.

## Records

Records are JSON objects. Besides your fields, every record has `id`, `created_date`, `updated_date` and `created_by`. Schemas aren't enforced strictly: fields you don't declare are still stored, and changing a schema needs no migration. Declared `required` fields and `default` values are applied on create.

## Queries

`filter` takes MongoDB-style queries:

| Operator | Example |
|---|---|
| equality | `{ status: "open" }` |
| `$ne` `$gt` `$gte` `$lt` `$lte` | `{ price: { $lt: 20 } }` |
| `$in` `$nin` | `{ tag: { $in: ["a", "b"] } }` |
| `$all` `$size` `$exists` | `{ tags: { $all: ["x"] } }` |
| `$regex` (case-insensitive by default) | `{ title: { $regex: "draft" } }` |
| `$or` `$and` `$nor` | `{ $or: [{ a: 1 }, { b: 2 }] }` |

Dotted paths reach into nested objects: `{ "address.city": "Izmir" }`. Sort with a field name, `-field` for descending, or several separated by commas.

## Limits

5,000 records per entity, 200 KB per record, 500 records per bulk create, up to 5,000 records per list call.
