Добавление документа в snapshotChanges добавляет 2 документа - PullRequest
0 голосов
/ 05 июля 2018

Итак, я пытаюсь добавить документ, если запрос возвращает 0 документов. И я получил его, чтобы создать новый документ, но по какой-то причине он создает 2? Есть ли способ ограничить его создание только одного?

Вот метод

this.currentMonth = this.monthCollection.snapshotChanges().map(snapshot => {
  if (snapshot.length <= 0) {
    this.createNewMonth(); <---- THIS GETS CALLED TWICE
  }
  return snapshot.map(doc => {
    const data = doc.payload.doc.data();
    data.id = doc.payload.doc.id;
    this.currentMonthId = doc.payload.doc.id;
    this.currentMonthTotalSpent = doc.payload.doc.data().totalSpent;

    this.expenseCollection = this.monthCollection.doc(doc.payload.doc.id).collection('expenses');
    this.expenses = this.expenseCollection.snapshotChanges().map(snapshot => {
      return snapshot.map(doc => {
        const data = doc.payload.doc.data();
        data.id = doc.payload.doc.id;
        return data;
      });
    });
    return data;
  });
});

РЕДАКТИРОВАТЬ: Итак, немного больше деталей, когда приложение открывается, мне нужно проверить Firestore для объекта месяца, который имеет конечную метку времени, которая больше, чем текущее время. Если это не так (что означает новый месяц), мне нужно создать новый месяц. Я поместил метод, который создает новый месяц ниже для справки. У меня проблема в том, что созданы 2 документа, и мне нужен только один.

  createNewMonth() {
    let date = new Date(), y = date.getFullYear(), m = date.getMonth();
    let firstDay = new Date(y, m, 1);
    let lastDay = new Date(y, m + 1, 0);

    let newMonth = {
      categories: [],
      endTimestamp: moment(lastDay).unix(),
      name: this.getMonthNameFromTimestamp(moment().unix()),
      startTimestamp: moment(firstDay).unix(),
      totalSpent: 0
    }
    this.monthCollection.add(newMonth);
  }

РЕДАКТИРОВАТЬ 2: просто для справки здесь monthCollection

this.monthCollection = this.afs.collection('users').doc(this.auth.getUserId()).collection('months', ref => {
      return ref.where('endTimestamp', '>=', moment().unix()).limit(1);
    });

РЕДАКТИРОВАТЬ 3: Итак, я переместил извлечение из снимка в другую проверку, но он все еще создает 2 документа. То, что вы видите ниже, находится над другим кодом.

this.afs.collection('users').doc(this.auth.afAuth.auth.currentUser.uid).collection('months').ref.where('endTimestamp', '>=', moment().unix()).get().then((result) => {
      if (result.empty || result.size <= 0) {
        this.createNewMonth();
      }
    });

1 Ответ

0 голосов
/ 05 июля 2018

Ожидается, что ваш слушатель снимка срабатывает дважды.

Первый раз даст вам начальное содержимое коллекции. Затем в функции createNewMonth () вы добавляете новый документ в ту же коллекцию. После этого прослушиватель снимков во второй раз активирует обновленное содержимое коллекции, которая теперь содержит только что добавленный документ.

Вы должны знать, что в snapshot нет свойства length, которое получает ваша функция слушателя. Это не правильный код:

if (snapshot.length <= 0) {
  this.createNewMonth();
}

snapshot является QuerySnapshot объектом. Если вы хотите узнать, сколько документов содержится в этом снимке, используйте его свойство size или его свойство empty.

Кроме того, если вы не хотите постоянно отслеживать коллекцию на наличие изменений, подобных этой, рассмотрите возможность использования get() в ссылках на коллекцию вместо добавления прослушивателя, как вы сейчас. Это даст вам один набор результатов за один раз.

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