Как оптимизировать операцию чтения / записи Firestore - PullRequest
0 голосов
/ 03 июня 2018

Я пытаюсь создать приложение для мониторинга запасов, где пользователи могут сделать 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кажутся слишком большими операциями для таких маленьких примеров.Это правильный способ, которым я должен выложить структуру данных?Или есть лучший способ сделать это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...