Как добавить временную метку к каждой вставке коллекции, обновить функции firebase для базы данных firestore - PullRequest
0 голосов
/ 05 октября 2018

У меня есть коллекция Firestore, которая называется Posts. Я делаю вставку на стороне клиента, и она работает.

Я хочу добавить поля createAt и updatedAt в каждую вставку в моем хранилище коллекции сообщений, используя функции firebase.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Вам не нужны облачные функции для этого.Намного проще (и дешевле) установить временную метку сервера в клиентском коде следующим образом:

var timestamp = firebase.firestore.FieldValue.serverTimestamp()   
post.createdAt = timestamp
post.updatedAt = timestamp
0 голосов
/ 05 октября 2018

Чтобы добавить отметку времени createdAt к записи Post через облачную функцию, выполните следующие действия:

exports.postsCreatedDate = functions.firestore
  .document('Posts/{postId}')
  .onCreate((snap, context) => {
    return snap.ref.set(
      {
        createdAt: admin.firestore.FieldValue.serverTimestamp()
      },
      { merge: true }
    );
  });

Чтобы добавить отметку времени modifiedAt к существующей Post Вы можете использовать следующий код. ОДНАКО , эта облачная функция будет запускаться каждый раз, когда изменяется поле документа Post, включая изменения полей createdAt и updatedAt, , оканчивающихся бесконечным циклом ....

exports.postsUpdatedDate = functions.firestore
  .document('Posts/{postId}')
  .onUpdate((change, context) => {
    return change.after.ref.set(
      {
        updatedAt: admin.firestore.FieldValue.serverTimestamp()
      },
      { merge: true }
    );
  });

Таким образом, вам необходимо сравнить два состояния документа (то есть change.before.data() и change.after.data(), чтобы определить, касается ли изменение поля, которое не является createdAt или updatedAt.

Например, представьте, что ваш почтовый документ содержит только одно поле name (без учета двух полей меток времени), вы можете сделать следующее:

exports.postsUpdatedDate = functions.firestore
  .document('Posts/{postId}')
  .onUpdate((change, context) => {
    const newValue = change.after.data();
    const previousValue = change.before.data();

    if (newValue.name !== previousValue.name) {
      return change.after.ref.set(
        {
          updatedAt: admin.firestore.FieldValue.serverTimestamp()
        },
        { merge: true }
      );
    } else {
      return false;
    }
  });

ВДругими словами, боюсь, вам нужно сравнивать два состояния документа поле за полем ....

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