Я вижу две возможности:
1. Запишите идентификатор автора в документах
Если вы можете написать в двух документах идентификатор автора, в своей облачной функции вы можете проверить, соответствует ли этот идентификатор идентификатору пути.
Что-то вроде следующего:
export const notificationOnMessageReceived =
functions.firestore
.document('users/{uid}/matches/{match}/messages/{message}')
.onCreate(async (snapshot, context) => {
const newValue = snapshot.data();
const authorId = newValue.authorId;
const pathUid = context.params.uid;
if (authorId === pathUid) {
//proceed with the notification
} else {
return null;
}
})
Конечно, это подразумевает, что каждый раз функция облака запускается один раз "ни за что". Что касается цены вызова функции Cloud, это допустимо.
2. Записать дополнительный документ в выделенную коллекцию
Таким образом, только один документ вызовет функцию Cloud, но недостатком, очевидно, является дополнительная запись. С точки зрения цены, это выше, чем предыдущее решение (на основе Blaze Plan , цены ). Вы можете регулярно запускать облачную функцию расписания, которая удаляет обработанные документы.
СТОРОНА ПРИМЕЧАНИЕ: Вы, очевидно, используете старую версию Firebase SDK для облачных функций, см. https://firebase.google.com/docs/functions/beta-v1-diff#cloud -firestore . Начиная с версии 1.0 SDK, параметр event
для асинхронных функций Firestore устарел. Он был заменен двумя новыми параметрами: snapshot
и context
.