новые функции облака Google.
Я разрабатываю сборщик данных с датчиков. Те сенсор толкают информацию на пабе. Затем я разработал триггер pubsub, который берет данные из pubsub и ведет их через пожарный магазин в режиме реального времени.
Моя проблема в том, что данные, поступающие с датчика, всегда разные, а структура сына для обновления одинакова.
Я могу выполнять обновление в реальном времени по фиксированной структуре (например, обновляется массив сыновей из 4 элементов), но мне бы хотелось, чтобы моя функция считывала то, что находится в pubsub, и обновляла только относительный элемент в firestore.
Например, датчик отправляет сообщение со статусом: Вкл. Прибытие на pubsub, моя функция должна обновлять только переменную состояния. Я думаю, что для создания массива, каждый раз отличающегося друг от друга, следует использовать цикл foreach над полезной нагрузкой, но я не могу найти ни одного примера.
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const db = admin.firestore();
/**
* Receive data from pubsub, then
* Maintain last device data on Firestore 'devices' collections then
* Write telemetry raw data to 'devices/location_logs' subcollection
*/
exports.receiveTelemetry = functions.pubsub
.topic('telemetry-topic')
.onPublish((message, context) => {
const attributes = message.attributes;
const payload = message.json;
const deviceId = attributes['deviceId'];
const data = {
deviceId: deviceId,
timestamp: new Date(context.timestamp),
deviceUptime: payload.Uptime,
deviceWifiSignal: payload.Sig
};
let deviceRef = db.collection('devices').doc(deviceId);
return deviceRef.get().then(doc => {
if (!doc.exists) {
data.state = 'MOVING';
return Promise.all([
updateCurrentDataFirestore(deviceRef, data),
insertLocationLog(deviceRef, data)
]).then(() => {
return updateDeviceDateIndex(deviceRef, data, {});
});
}
let device = doc.data();
return updateCurrentDataFirestore(deviceRef, data);
});
});
/**
* Maintain last status in Firestore
*/
function updateCurrentDataFirestore(deviceRef, data) {
return deviceRef.set(
{
deviceWifiSignal: data.deviceWifiSignal,
deviceUptime: data.deviceUptime
},
{ merge: true }
);
}
/**
* Update device date index with all days that have data
*/
function updateDeviceDateIndex(deviceRef, data, dateIndex) {
const key = data.timestamp.toJSON().substring(0, 10);
const count = dateIndex[key];
if (!count) {
dateIndex[key] = 1;
} else {
dateIndex[key] = count + 1;
}
return deviceRef.update({
dateIndex
});
}