Я пытаюсь создать приложение для мониторинга запасов, где пользователи могут сделать Alert
при изменении цены.
У меня есть Stock
документ, в котором я периодически получаю данные от стороннего API.При обновлении Stock
я получаю все Alert
, которые удовлетворяют условию, и уведомляю пользователей с помощью сообщений Firebase.
Вот мои модели.
/stocks/{stockId}
id: String
price: Number
/alerts/{alertId}
stockId: String
price: Number
condition: [moreThan, lessThan]
uid: String // User who create alert
/users/{userId}
id: String
fcmToken: String
Каждые 5 минут я получаю последние цены на акции иобновить фондовый документ = number of stock
запрос на запись.
function updateStockPrice(): Promise<FirebaseFirestore.WriteResult[]> {
const db = admin.firestore();
const options = {
// Options for stock api
};
return client(options)
.then(function(body) {
let batch = db.batch()
for(var stock in body){
let data = // create data from json response
let docRef = db.collection("stocks").doc(//id from 3rd party api)
batch.set(docRef, data)
}
return batch.commit()
});
}
При обновлении записи на складе циклически просмотрите оповещения и получите токен fcm от соответствующего пользователя для отправки push-уведомлений = (* alert query
+ number of alerts matched condition for user query
) xnumber of stock update
export const onStocksUpdate = functions.firestore.document('stocks/{stockId}').onWrite(function(change, context) {
const db = admin.firestore()
const newValue = change.after.data();
const previousValue = change.before.data();
const stockId = Number(context.params.stockId)
let p1 = db.collection("alerts")
.where("stockId", "==", stockId)
.where("condition", "==", "moreThan")
.where("price", "<=", newValue.lastPrice)
.get()
.then(function(querySnapshot) {
const promises = []
querySnapshot.forEach(function(doc) {
let data = doc.data()
let user = db.collection("users").doc(data.uid).get()
user.then(function(snapshot) {
let userData = snapshot.data()
return userData.fcmToken
}).then(function(fcmToken) {
const payload = {
notification: {
title: // title,
body: // body
},
token: fcmToken
}
return admin.messaging().send(payload)
}).catch(function(error) {
console.log(error)
})
promises.push(user)
})
return Promise.all(promises)
}).then((response) => {
// Response is a message ID string.
console.log('Successfully sent message:', response);
})
.catch((error) => {
console.log('Error sending message:', error);
});
return p1
})
Всего записей = number of stock
Всего прочитанных = (alert query
+ number of alerts matched condition for user query
) x number of stock update
Скажем, у меня 20 акций, 1 пользователь с 3оповещения.
Каждые 5 минут я буду использовать 20 запросов на запись и (1 + 3) x 20 = 80 читать
За 1 день = 5760 записей и 23 040 читать
Thisкажутся слишком большими операциями для таких маленьких примеров.Это правильный способ, которым я должен выложить структуру данных?Или есть лучший способ сделать это?