ДОВІДНИК З NODE-RED українською мовою
Написати фрагмент програми на Node-RED, який буде записувати значення згенерованих змінних у базу даних часових рядів в базі даних MongoDB та перевірити її функціональність.
Повинна бути реалізована наступна функціональність:
tscollection1 з типом timeseriesramp - рампа з періодом 6.28 та sin - синусоїда, що розраховується за rampУ даному рішенні використовуються:
node-red-contrib-mongodb4Застосунок реалізований у вигляді одного потоку-вкладки, що включає три логічні частини, що реалізовані окремими потоками:
tscollection1 з типом timeseries
Створення в MongoDB колекції tscollection1 з типом timeseries відбувається вручну через ініціювання потоку кнопкою на Inject. Вузол createCollection має наступні налаштування:

У даному випадку використовується метод createCollection об’єкту database. Самі аргументи передаються через масив в msg.payload. Про принципи роботи з вузлами MongoDB4 можна почитати в цьому описі. При цьому налаштування конфігураційного вузла advanced coonection має наступний вигляд для прикладу:

Функція що формує повідомлення для вузла створення колекції має наступний вигляд:
msg.payload = ["tscollection1",
{
timeseries: {
timeField: "timestamp",
metaField: "metadata",
granularity: "seconds"
}
}]
return msg;
Це параметри функції createCollection про яку можна почитати за цим посиланням. Першим параметром є назва колекції "tscollection1" а другим є options, в якому вказується що це буде колекція типу timeseries, в якій задаються назви полів для відмітки часу та метаданих, та гранулярність запису. Додатково про використання TSDB в MongoDB можна почитати тут і тут

Потік генерування змінних та записування їх в базу даних починається з вузла Inject, який налаштований на записування кожні 5 секунд. Вузол-функція generate має наступний вигляд:
let now = new Date ();
let ramp = msg.payload/62800 - Math.trunc(msg.payload/62800);
let grad = ramp * 6.28;
let sin = Math.sin(grad);
msg.topic = "simulation";
msg.ts = now;
msg.payload = {ramp:ramp, sin:sin};
return msg
Цей вузол генерує msg.payload зі значенням генерованих змінних та msg.ts зі значенням відмітки часу.
Вузол InsertOne використовує метод insertOne вказаного об’єкта-колекції tscollection1 для вставлення нового документу. Для всіх операцій крім створення колекції можна б було скористатися вузлами класичної бібліотеки node-red-node-mongodb тут бібліотека mongodb4 використана для уніфікації.

Вузол-функція tomomgo формує аргументи для методу insertOne, який включає лиш зміст документу:
let msg1 = {};
msg1.payload = [{
"metadata": { "topic": msg.topic },
"timestamp": new Date(msg.ts),
"ramp": msg.payload.ramp,
"sin": msg.payload.sin
}]
return msg1;
Як видно зміст документу включає два обов’язкові поля metadata та timestamp, які були означені при створенні, та два поля з плинними значеннями. За змістом метаданих можна робити фільтрацію документів.
Наступний потік потрібен для перевірки вибірки даних за часовими діапазонами:

Вузол find реалізує однойменний метод колекції:

Вузол-функція перед ним формує аргументи, які задають вираз, що формує правило, яким повинні задовольняти документи, які повертаються:
msg.payload = [{
$expr:{
$gt:[
"$timestamp",
{$dateAdd:
{
startDate: new Date(),
unit: 'second',
amount: -60
}}
]
}
}]
return msg;
$expr - забезпечує виконання виразів порівняння полів в тому самому документі. $gt - порівнює два значення, що вказані в якості аргументу. Перше значення це поле timestamp, тоді як друге розраховується як сума плинної дати та часу та -60 секунд. Тобто це по факту час, що на 60 секунд менше за теперішній.
Зробивши ручне ініціювання потоку ми отримаємо приблизно таке повідомлення:

Експорт потоку доступний за посиланням