Інтеграція Payload CMS з базою даних (MongoDB/PostgreSQL)

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Інтеграція Payload CMS з базою даних (MongoDB/PostgreSQL)
Середня
від 1 робочого дня до 3 робочих днів
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Налаштування PostgreSQL і MongoDB у Payload CMS

Payload 2.x підтримує два адаптери БД: PostgreSQL через Drizzle ORM і MongoDB через Mongoose. Вибір впливає на схему зберігання даних, можливості запитів та продуктивність.

PostgreSQL через Drizzle ORM

npm install @payloadcms/db-postgres
// payload.config.ts
import { postgresAdapter } from '@payloadcms/db-postgres'

export default buildConfig({
  db: postgresAdapter({
    pool: {
      connectionString: process.env.DATABASE_URL,
      // Або явні параметри:
      host: 'localhost',
      port: 5432,
      database: 'payload_db',
      user: 'payload',
      password: process.env.DB_PASSWORD,
      max: 20,           // максимум з'єднань у пулі
      idleTimeoutMillis: 30000,
    },
    push: false,         // не пушити схему в production (використовувати міграції)
    migrationDir: './migrations',
  }),
})

Міграції Drizzle:

# Генерувати міграцію після змін колекцій
npx payload migrate:create

# Застосувати міграції
npx payload migrate

# Откат
npx payload migrate:down

# Статус
npx payload migrate:status

Міграції зберігаються у ./migrations/*.ts — можна редагувати вручну для складних змін схеми.

Схема зберігання в PostgreSQL:

-- Для колекції posts Payload створює таблиці:
SELECT table_name FROM information_schema.tables
WHERE table_name LIKE 'posts%';

-- posts                   — основні дані
-- posts_rels              — зв'язки (relationship fields)
-- posts_locales           — локалізовані поля (якщо ввімкнено)
-- _posts_v                — версії (якщо ввімкнено версіонування)
-- _posts_v_locales        — версії локалізованих полів

Прямі запити через Drizzle:

import { getPayload } from 'payload'
import config from '@payload-config'

const payload = await getPayload({ config })
const drizzle = payload.db.drizzle  // прямий доступ до Drizzle екземпляра

// Raw SQL запит
const result = await drizzle.execute(
  sql`SELECT p.*, COUNT(c.id) as comment_count
      FROM posts p
      LEFT JOIN comments c ON c.post_id = p.id
      WHERE p.status = 'published'
      GROUP BY p.id
      ORDER BY comment_count DESC
      LIMIT 10`
)

MongoDB через Mongoose

npm install @payloadcms/db-mongodb
import { mongooseAdapter } from '@payloadcms/db-mongodb'

export default buildConfig({
  db: mongooseAdapter({
    url: process.env.MONGODB_URI!,
    // Параметри з'єднання
    connectOptions: {
      maxPoolSize: 10,
      serverSelectionTimeoutMS: 5000,
    },
  }),
})

Прямий доступ до Mongoose:

const payload = await getPayload({ config })
const mongoose = payload.db.mongoose  // mongoose екземпляр

// Нативний запит MongoDB
const result = await mongoose.connection.db
  .collection('posts')
  .aggregate([
    { $match: { status: 'published' } },
    { $group: { _id: '$category', count: { $sum: 1 } } },
    { $sort: { count: -1 } },
  ])
  .toArray()

Порівняння адаптерів

Критерій PostgreSQL MongoDB
Складні зв'язки Краще (JOIN) Через $lookup
Схема Строга, міграції Гнучка
Версіонування Окремі таблиці _v Окремі колекції
Локалізація Таблиці _locales Вкладений об'єкт
Хостинг Supabase, Neon, Railway MongoDB Atlas
Рекомендація для production Так, для структурованих даних Так, для гнучких схем

Перемикання адаптерів

Перемкнути адаптер після запуску в production без міграції даних неможливо напряму — потрібен експорт/імпорт через Payload API. Вибір робиться на початку проекту.

Налаштування для production

// PostgreSQL в production — через SSL та connection pooling
db: postgresAdapter({
  pool: {
    connectionString: process.env.DATABASE_URL,
    ssl: { rejectUnauthorized: true },
    max: 10,
  },
  push: false,  // ПОВИНЕН бути false в production
})

// Або через PgBouncer/Supabase Pooler
// connectionString: 'postgresql://user:[email protected]:6543/postgres?pgbouncer=true'

Терміни

Початкове налаштування адаптера БД з міграціями займає 0,5 дня. Оптимізація запитів та індексування для production займає 1 день.