Files
payload/test/fields/collections/JSON/index.tsx
Sasha b878daf27a feat(db-postgres): deep querying on json and rich text fields (#9102)
### What?
Allows to query on JSON / Rich Text fields in Postgres the same way as
in Mongodb with any nesting level.

Example:
Data:
```js
{
  json: {
    array: [
      {
        text: 'some-text', // nested to array + object
        object: {
          text: 'deep-text', // nested to array + 2x object
          array: [10], // number is nested to array + 2x object + array
        },
      },
    ],
  }
}
```
Query:
```ts
payload.find({
  collection: 'json-fields',
  where: {
    and: [
      {
        'json.array.text': {
          equals: 'some-text',
        },
      },
      {
        'json.array.object.text': {
          equals: 'deep-text',
        },
      },
      {
        'json.array.object.array': {
          in: [10, 20],
        },
      },
      {
        'json.array.object.array': {
          exists: true,
        },
      },
      {
        'json.array.object.notexists': {
          exists: false,
        },
      },
    ],
  },
})
```

### How?
Utilizes [the `jsonb_path_exists` postgres
function](https://www.postgresql.org/docs/current/functions-json.html)
2024-11-12 09:26:04 +02:00

77 lines
1.6 KiB
TypeScript

import type { CollectionConfig } from 'payload'
import { jsonFieldsSlug } from '../../slugs.js'
const JSON: CollectionConfig = {
slug: jsonFieldsSlug,
access: {
read: () => true,
},
fields: [
{
name: 'json',
type: 'json',
admin: {
maxHeight: 542,
},
jsonSchema: {
fileMatch: ['a://b/foo.json'],
schema: {
type: 'object',
properties: {
array: {
type: 'array',
items: {
type: 'object',
additionalProperties: false,
properties: {
object: {
type: 'object',
additionalProperties: false,
properties: {
array: {
type: 'array',
items: {
type: 'number',
},
},
text: {
type: 'string',
},
},
},
text: {
type: 'string',
},
},
},
},
foo: {
enum: ['bar', 'foobar'],
},
number: {
enum: [10, 5],
},
},
},
uri: 'a://b/foo.json',
},
},
{
name: 'group',
type: 'group',
fields: [
{
name: 'jsonWithinGroup',
type: 'json',
},
],
},
],
versions: {
maxPerDoc: 1,
},
}
export default JSON