### 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)
77 lines
1.6 KiB
TypeScript
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
|