Почему облачная функция иногда перезаписывает документ, но иногда объединяет данные? - PullRequest
0 голосов
/ 02 июня 2019

У меня есть коллекция камина с документами. И я написал облачную функцию для объединения документов в один документ с массивом объектов.

Проблема в том, что когда функция запускается впервые, она создает новый документ (для агрегированных данных) или перезаписывает существующий. Но затем, при изменении данных, функция только объединяет новые данные с существующими. Таким образом, при наличии только двух документов в коллекции в течение 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 () данных.

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