чорнетка 2

Рілейшени

one to many

many to many

many to one

Розглянемо на прикладі onе to many

створимо список тудущек для цього створимо схему

models/todoModel.js
const { model, Schema, Types } = require("mongoose");

const todoSchema = new Schema(
  {
    title: {
      type: String,
      required: true,
      maxLength: 20,
      trim: true,
    },
    description: {
      type: String,
      maxLength: 100,
    },
    due: {
      type: Date,
      required: true,
    },
    completed: {
      type: Boolean,
      default: false,
    },
    owner: {
      type: Types.ObjectId,
      ref: "User",
      required: [true, "Todo must have an owner.."],
    },
  },
  {
    timestamps: true,
    versionKey: false,
  }
);

const Todo = model("Todo", todoSchema);

module.exports = Todo;

В цьому прикладі із нового це owner. Тип має буди типом айдіщки. реф вказуємо назву колекції в якій якраз зьерігаються онери тобто користувачі.

тобто треба подивитися назву яку ми вказаои в моделі в юзерах.

required означає, що це обов'язковий параметр для тудушки і він не може бути нічийним.

для тудушек створимо окремі роути

тепер створимо контрололери тудушек

але роботу з моделлю можна витягнути в окремий сервіс.

І тоді контролер матиме такий вигляд:

і не забуваємо підключити роути в індекс файлі

Тепер якшо відправити пост запит http://localhost:3000/todos

але для цього потрібно внести ля запиту наш токен, бо спрацьовує перевірка мілдвар

відправляємо

отримуємо відповідь

у нас повертає всього owner, але якщо вказати в контролері (todoService) owner.id, то повернеться тільки id власника

  1. Створимо контролер для отримання тудушек

от сам контролер обробника отримання тудужег

а от сервіс

вищезазначений код витягає дані всіх тудушек за шдяхом гет http://localhost:3000/todos

тотал - кількість результатів

опція populate - дає мождивість повернути розгорнуто оунера але в моделі має бути ref навпроти того поля

const todosQuery = await Todo.find(findOptions).populate(path: "owner", select: 'name email role');

але можна повенрути оунера окремо вкінці

а попюдейт прибрати

КВЕРІ БІЛДЕР!

зазвичай виносять в окремий сервіс окремий клас

Запит пагінації з фронтенда передаватиметься як квері рядок

в постмені є квері парамс

і отримання переданих параметрів квері із рядка добиться черех req.query.

$regex - сталі комбінації. можна почитати в техдокументації.

https://www.mongodb.com/docs/manual/reference/operator/query/regex/

Треба в базу даних додати побільше тудушек З різними значеннями полів щоб відпрацювати пошук

ЗРОБИМО ПОШУК ПО TITLE AБО DESCRIPTION

Тепер опигемо пошук за певним критерієм переданим в квері гет http://localhost:3000/todos?search=cookie

Пошук відбувається чітко по збігу слова (пошук відбувався суто по тайтлу)

Щоб прописати, щоб регістр не врливав на видачу результатів, тобто , щоб і великими і малими літерами повертадо рещультат є

якщо нап мотрібно зробити пощук на збіг і в полі тайтл і в полі дескріпшн, то пишемо використовуючи такі оператори

але якщо ми в search не передамо нічого, то у нас буде помилка сервера. у цьому разі потрібно зробити умову, якшо search прийшло то шукаємо за заданим пошуком, якшо немає, то повертаємо всі варіанти

Зараз повертаються усі тудушки навіть чужі, тому треба робити вибілку тільки серед своїх тудушек

Для цього ми з параметром oblect в сервіси передамо це параметр юзера, щоб робити вибілку по цьому юзеру

можна найпростіше зробити owner: user

А можна після задання пошукових опцій перевірити для кожної тудушки чи це цього користувача запис і якщо да, то і якщшо це юзер передати користувача його айді і тоді вибілка буде тільки бо його тудузках (модератор і адмін матиме доступ до всіх тудушек)

ТЕПЕР СОРТУВАННЯ по параметру і ордеру

(по хорошому на ртримані квері дані теж треба прописувати валідатор, щоб не приходило підозрідих даних - так само як і валідували req.body так само валідуємо req.query)

в квері передаватимемо sort - за яким принципом будемо сортувати (передаємо туди поле бази даних за яким будем осортувати) наприклад title, description...

другий параметр order (від більшого до меншого чи від меншого до більшого DESC і ASC)

методи сортування вказують лдразу після find і вказуємо філди по яких сортуємо наприклад:

якщо зочемо в зворотньому напрямку сортувати то перед назвою поля ставоять знак мінуса

Але в якості параметра сортування можна передати динамічні змінні

тобто, якшо отримуэмо DESC, то ставимо мінус і сортуємо за отриманим полем, якщо поле не передали, то за замовчанням візьмемо title.

Гет запит наприкдаж може бути такий

http://localhost:3000/todos?order=DESC&sort=description

порефакторимо цей код

примітка решультат пошуку виконується тільки після вказування await

тому код запиту можна розписати так

Це зробили для того, щоб вписувати додаткові параметри запиту

ПАГІНАЦІЯ

пашінація робиться за допомогою limit (скільки повернути - кількість) і skip (скільки пропускаємо після першого результату наприклад якщо 10 то 10 пропустить і з 11 буде видавати(це не індекс, а кількість))

проразуємо формули (отримуємо з квері номер сторінки запиту і макс кількість, яка має повернутися з бекенду)

Наприклад: ліміт 10. це означає, щ о при першій сторінці потрібно пропустити 0 документів, при друшій сторінці -пропустити 10 документів, третя сторінка - 20 документів. (page 1 = skip 0, page 2 = skip 10, page 3 = skip 20)

з опцій отримаємо номер сторінки запиту, якщо параметр не переданий, то за замовчанням сторінка 1. + означає стріншу перетворити в номер. використано тернарник. за такою ж аналогією отримуємо кількість результатів в запиті за замовчанням 5. Виразуємо формуду для скіп:

Тепер окремо пропишемо наші параметри запиту

і тільки потім запит

і от наприклад повний запит

http://localhost:3000/todos?search=cookie&order=DESC&sort=description&limit=3&page=1

Повертати також треба загалну кількість результатів, щоб на фронтенді мошли коректно розрахувати кількість сторінок і кількість пагінацій.

і тоді у наш контролео уже треба повертати не просто todos, а обʼєкт результатів і повної кількості збігів

Відповідно потрібно і переробити контролер

Last updated