Working with JSON Fields

1. Defining JSON Fields

metadata Json   @default("{}")
tags     Json?
AspectDetail
PG defaultjsonb (recommended)
MySQLjson
SQLiteStored 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 }
  }
});
TypeJSON.stringify
ObjectStored as JSON object
ArrayStored as JSON array
nullUse Prisma.JsonNull for JSON null, Prisma.DbNull for SQL NULL

3. Querying JSON Fields

FilterExample
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

OperatorType
equalsExact
notNegation
gt/gte/lt/lteNumeric/string compare on PG

5. Using Array Contains

await prisma.user.findMany({
  where: { metadata: { path: ["flags"], array_contains: ["beta", "alpha"] } }
});
OperatorDetail
array_containsAll values present
array_starts_withBegins with value
array_ends_withEnds with value

6. Checking Key Existence

ApproachExample
Path equals not null{ metadata: { path: ["plan"], not: Prisma.AnyNull } }
Raw SQLWHERE metadata ? 'plan' (PG)

7. Using String Contains

OperatorDetail
string_containsSubstring match
string_starts_withPrefix match
string_ends_withSuffix 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.
PatternApproach
Full replacePass new object
Partial updateRead–merge–write or raw jsonb_set

9. Validating JSON Structure

ToolUse
ZodValidate at API boundary
JSON SchemaCombine with Ajv for cross-language contracts
TS typesDeclare type Metadata = { plan: "free"|"pro" } and cast

10. Using Native JSON Functions

FunctionDBUse
jsonb_setPGMutate path in place
jsonb_array_elementsPGFlatten arrays
JSON_EXTRACTMySQLPick value at path
->>PGText extract