У меня есть коллекция камина с документами. И я написал облачную функцию для объединения документов в один документ с массивом объектов.
Проблема в том, что когда функция запускается впервые, она создает новый документ (для агрегированных данных) или перезаписывает существующий. Но затем, при изменении данных, функция только объединяет новые данные с существующими. Таким образом, при наличии только двух документов в коллекции в течение 25 изменений документ агрегации будет расширен до 50 элементов в массиве (вместо ожидаемых двух).
Но затем, если я подожду некоторое время (10-20 минут) и попытаюсь снова, функция, наконец, переписывает документ. А затем снова объединяет данные.
Была ли у кого-нибудь такая проблема?
Как сказать пожарному магазину, что документ должен быть строго переписан?
Я пробовал обновить, установить (data, {merge: false}) методы, результат тот же. Пытался сначала удалить документ, а затем создать новый, но firestore ведет себя неадекватно, иногда удаляет, но иногда создает документ.
exports.aggregateTracks = functions.firestore
.document('playlists/{playlistId}/tracks/{trackId}')
.onWrite((change, context) => {
const playlistId = context.params.playlistId;
const trackId = context.params.trackId;
const docRef = admin.firestore().collection('playlists').doc(playlistId);
docRef.collection('tracks').orderBy('likes', 'desc')
.get()
.then(querySnapshot => {
trackCount = querySnapshot.size;
querySnapshot.forEach(doc => {
tracks.push(doc.data());
});
resultRef = admin.firestore().collection('playlists').doc(playlistId)
.collection('trackAggregation').doc('trackAggregation');
var FieldValue = admin.firestore.FieldValue;
var data = {
count: trackCount,
tracks: tracks,
timestamp: FieldValue.serverTimestamp()
};
resultRef.set(data);
return docRef;
}).catch(err => console.log(err));
return null;
});
Я ожидаю, что документ перезаписывается каждый раз, когда функция .set () данных.