QuerySnapshot удаляет данные после достижения limit () - PullRequest
0 голосов
/ 05 мая 2020

В настоящее время у меня настроен моментальный снимок запроса, позволяющий получать данные в реальном времени из моего экземпляра Firestore:

let query = db.collection('Tasks')
.where('active', '==', 1)
.where("starts", ">", +new Date())
.where('user', '==', userId)
.orderBy('starts', 'asc').limit(25);

let observer = query.onSnapshot(async snapshot => {
                snapshot.docChanges().forEach(change => {
                    renderTask(change.doc, change.type);
                });
        }, err => {
            console.trace(err);
        });

Однако при добавлении новой «Задачи» и превышении предельного значения в запросе, ie когда запрос в настоящее время прослушивает 25 документов, он вызывает прослушиватель моментальных снимков, сообщая, что документ был удален. Где change.type === 'removed', но на самом деле никакие документы, которые прослушивались, не изменились.

В настоящее время я использую этот метод, чтобы проверить, действительно ли пользователь удалил «Задачу», где active == 0, но когда я go сверх лимита для вызова документов в запросе, он также удаляет случайную «задачу».

Я пробовал добавить предложение if, чтобы проверить, содержат ли данные документа active = 0, но это не ' t работает и документ (даже если он был изменен на active = 0, он все еще содержит active = 1, и я предполагаю, что Firestore не беспокоится о возврате обновленного документа, поскольку предполагает, что он не будет использоваться? Это не ' t идеально, так как я бы также предположил, что список для документа также будет отделен, если firestore считает, что документ был удален.

Как я могу различать документы, которые были фактически удалены, ie active === 0 и документы, которые удаляются из-за достижения порогового значения количества запросов?

Заранее большое спасибо.

1 Ответ

0 голосов
/ 05 мая 2020

Это интересный вариант использования! Готового решения нет. Даже используя свойства oldIndex и newIndex, вы не можете определить, действительно ли документ был удален из базы данных («жесткое удаление») или просто удален из запроса.

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

  let observer = query.onSnapshot(
    (snapshot) => {
      snapshot.docChanges().forEach((change) => {

        if (change.type === 'removed') {
          const docRef = db.collection('Tasks').doc(change.doc.id);

          docRef
            .get()
            .then(function (doc) {
              if (doc.exists) {
                console.log('STILL EXISTS');
                //Do something...
              } else {
                console.log('HARD DELETED');
                //Do something else...
              }
            })
        } else {
            //.....
        }
      });
    },
    (err) => {
      console.trace(err);
    }
  );

Обратите внимание, что вы не должны использовать async в query.onSnapshot(async snapshot => {...}), поскольку наблюдатель не в функции async .

...