Working with JSON Fields
1. Defining JSON Fields
metadata Json @default("{}")
tags Json?
| Aspect | Detail |
| PG default | jsonb (recommended) |
| MySQL | json |
| SQLite | Stored as text — no JSON ops |
2. Storing JSON Objects and Arrays
await prisma.user.create({
data: {
email: "a@b.io",
metadata: { plan: "pro", flags: ["beta"], score: 42 }
}
});
| Type | JSON.stringify |
| Object | Stored as JSON object |
| Array | Stored as JSON array |
| null | Use Prisma.JsonNull for JSON null, Prisma.DbNull for SQL NULL |
3. Querying JSON Fields
| Filter | Example |
path | { metadata: { path: ["plan"], equals: "pro" } } |
string_contains | { metadata: { path: ["bio"], string_contains: "dev" } } |
array_contains | { metadata: { path: ["flags"], array_contains: "beta" } } |
4. Filtering JSON Values
| Operator | Type |
equals | Exact |
not | Negation |
gt/gte/lt/lte | Numeric/string compare on PG |
5. Using Array Contains
await prisma.user.findMany({
where: { metadata: { path: ["flags"], array_contains: ["beta", "alpha"] } }
});
| Operator | Detail |
array_contains | All values present |
array_starts_with | Begins with value |
array_ends_with | Ends with value |
6. Checking Key Existence
| Approach | Example |
| Path equals not null | { metadata: { path: ["plan"], not: Prisma.AnyNull } } |
| Raw SQL | WHERE metadata ? 'plan' (PG) |
7. Using String Contains
| Operator | Detail |
string_contains | Substring match |
string_starts_with | Prefix match |
string_ends_with | Suffix match |
8. Updating JSON Fields
await prisma.user.update({
where: { id: 1 },
data: { metadata: { plan: "enterprise", flags: ["beta", "neo"] } }
});
Warning: Prisma overwrites the entire JSON value. To merge keys, fetch existing JSON, spread, and write back, or use a raw jsonb_set SQL.
| Pattern | Approach |
| Full replace | Pass new object |
| Partial update | Read–merge–write or raw jsonb_set |
9. Validating JSON Structure
| Tool | Use |
| Zod | Validate at API boundary |
| JSON Schema | Combine with Ajv for cross-language contracts |
| TS types | Declare type Metadata = { plan: "free"|"pro" } and cast |
10. Using Native JSON Functions
| Function | DB | Use |
jsonb_set | PG | Mutate path in place |
jsonb_array_elements | PG | Flatten arrays |
JSON_EXTRACT | MySQL | Pick value at path |
->> | PG | Text extract |