Добавить документ, если запрос возвращает 0 документов - PullRequest
0 голосов
/ 05 июля 2018

Итак, я пытаюсь добавить документ в коллекцию, если мой запрос не дает результатов. Я разместил запрос ниже, но нет операторов для проверки длины или размера полученного запроса. Как я могу это сделать?

Вот запрос:

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

Если этот запрос не возвращает никаких документов, мне нужно запустить createNewMonth();, чтобы добавить в коллекцию месяцев. Вот метод createNewMonth`

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
    }
    return this.monthCollection.add(newMonth);
  }

Есть ли способ сделать это внутри запроса, если я использую .then() или он должен быть вне запроса?

РЕДАКТИРОВАТЬ: Таким образом, я нашел способ создать один, но он создает 2 каждый раз вместо одного. Вот код.

this.currentMonth = this.monthCollection.snapshotChanges().map(snapshot => {
      if (snapshot.length <= 0) {
        this.createNewMonth();   <---- here is what I added, it creates 2
      }

      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;
      });
    });

1 Ответ

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

В angularfire2 при запуске .snapshotChanges() вы можете проверить, были ли результаты найдены следующим образом:

this.dbRef.snapshotChanges().subscribe(doc => {

if(doc.payload.exists)
{
///Do something with the returned data
}
else
{
this.createNewMonth();
}

});

при поиске .valueChanges(), если данные не найдены, то doc будет возвращено как ноль:

this.dbRef.valueChanges().subscribe(doc => {

if(doc)
{
///Do something with the returned data
}
else
{
this.createNewMonth();
}

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