Внесение изменений в таск

Научимся вносить изменения в задачи (таски) в MongoDB через n8n.

Схема сценария:

img1.png

Принцип работы:

  1. Вебхук принимает запрос с id задачи и объектом с полями, которые нужно изменить.
  2. Находим задачу по id.
  3. Узел Code формирует новый объект задачи
  4. Обновляем задачу в базе.
  5. Отвечаем на запрос.

Принимаем запрос

Метод: PATCH Production URL https://bogutski.up.railway.app/webhook/todo Test URL https://bogutski.up.railway.app/webhook-test/todo

Я отправил тестовый запрос в Postman:

img2.png

Когда разрабатываете сценарий тестируйте каждый шаг и только потом переходите к следующему.

Находим задачу по id

Я использую такой подход, чтобы иметь возможность внести изменения на основе того что уже записано в документе и лучше контролировать процесс. В некоторых случая можно было бы применить операцию Find And Update.

img3.png

В поле Query я написал { "_id": "" }

Это запрос к базе с условием поиска и с шаблоном для подстановки значения.

Условия поиска – найти документ по полю _id.

Значение будет подставлено из селектора ``

Селектор указывает на то, что отдал предыдущий узел Webhook.

После обработки шаблона поле Query будет таким { "_id": "68afb40c10644334ee0f73d8" }.

Формируем новый объект задачи

В следующем узле Code я формирую новый объект задачи на основе того что уже есть в базе и того что пришло в запросе.

img4.png

Вы можете использовать этот код в этот и подобных сценариях:

const taskFromDatabase = $('Get Task By Id').first().json;
const requestBody = $('Webhook Update Tasks').first().json.body;

const { title, complete } = requestBody;
const patch = {};

if (title) patch.title = title;
if (complete) patch.complete = (complete === true || complete === 'true');

return {
  json: {
    ...taskFromDatabase,
    ...patch,
    updatedAt: Date.now(),
  }
};

Этот код делает следующее:

  1. Получает объект задачи из базы данных, который вернул узел Get Task By Id.
  2. Получает тело запроса из узла Webhook Update Tasks.
  3. Извлекает поля title и complete из тела запроса.
  4. Создает пустой объект patch, который будет содержать только те поля, которые нужно изменить.
  5. Если в запросе есть поле title, добавляет его в объект patch.
  6. Если в запросе есть поле complete, преобразует его в булево значение и добавляет в объект patch.
  7. Возвращает новый объект задачи, объединяя существующий объект задачи из базы с объектом patch и добавляя поле updatedAt с текущим временем.

Обновляем задачу в базе

Update Key:_id – значит, что мы будем искать документ по полю _id, то есть по 68afb40c10644334ee0f73d8" Fields: title, complete, createdAt, updatedAt – поля, которые мы будем обновлять.

img5.png

Подтверждение записи получаем в Output:

[
  {
    "title": "Learn N8N",
    "complete": true,
    "createdAt": 1756345356230,
    "updatedAt": 1756838507388
  }
]

Отвечаем на Webhook

Просто передаем в ответ объект задачи, который вернул предыдущий узел.

img6.png