Firestore: медленный запрос - PullRequest
0 голосов
/ 28 мая 2020

У меня есть запрос, который получает все сообщения из моей коллекции сообщений для определенного chatId. Затем он сортирует его в порядке убывания по метке времени createdAt и применяет к нему ограничение в 20 сообщений .. Мои запросы занимают ~ 2500 мс ... что, как мне кажется, медленно .. У меня даже не так много сообщений в моей коллекции так что я чувствую, что это может стать медленнее, если у меня их тысячи ... Я новичок в firestore, так что, возможно, я делаю что-то не так? Я ценю помощь! Вот код запроса:

exports.getMessages = functions.https.onCall(async (data, context) => {
  try {
    const startAt = data.startAt;
    const increment = 20;
    const limit = startAt + increment;
    const chatId = data.chatId;
    const snapshot = await firestore
      .collection('messages')
      .where('chatId', '==', chatId)
      .orderBy('createdAt', 'desc')
      .limit(limit)
      .get();
    const promises = [];
    snapshot.forEach(doc => {
      const message = {id: doc.id, ...doc.data()};
      const promise = combineUserAndMessage({
        message,
        userId: message.user._id,
      });
      promises.push(promise);
    });

    const messages = await Promise.all(promises);
    return {data: messages, startAt: limit};
  } catch (err) {
    console.log('GET MESSAGES ERROR: ', err);
    throw err;
  }
});

const combineUserAndMessage = async ({userId, message}) => {
  try {
    const userSnapshot = await firestore.doc(`users/${userId}`).get();
    const user = userSnapshot.data();
    const createdAt = new admin.firestore.Timestamp(
      message.createdAt._seconds,
      message.createdAt._nanoseconds,
    ).toDate();
    return {
      ...message,
      user: {
        _id: userId,
        name: user.displayName,
        avatar: user.profilePicture,
      },
      createdAt: createdAt.toString(),
    };
  } catch (err) {
    console.log('COMBINE USER AND MESSAGE ERROR: ', err);
    throw err;
  }
};

EDIT: Я взял тест из журналов функций. Я понимаю, что в этот тест могут быть включены затраты на холодный запуск, поэтому я попытаюсь протестировать его, используя свои собственные журналы. Тем не менее, если кто-то видит что-то не так с запросом или знает способ сделать его быстрее / лучше, я все равно буду признателен!

...