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