首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在snapshotChanges中添加文档将添加2个文档

在snapshotChanges中添加文档将添加2个文档
EN

Stack Overflow用户
提问于 2018-07-06 02:50:56
回答 1查看 46关注 0票数 0

因此,如果查询返回0个文档,我将尝试添加一个文档。我已经让它创建了新文档,但是出于某种原因,它创建了2个?有没有办法把它限制为只创建一个?

下面是方法

代码语言:javascript
复制
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中是否有一个具有大于当前时间的结束时间戳的month对象。如果不是这样(这意味着它是一个新的月份),我需要创建一个新的月份。我将创建新月份的方法放在下面以供参考。我的问题是创建了2个文档,而我只需要一个。

代码语言:javascript
复制
  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

代码语言:javascript
复制
this.monthCollection = this.afs.collection('users').doc(this.auth.getUserId()).collection('months', ref => {
      return ref.where('endTimestamp', '>=', moment().unix()).limit(1);
    });

编辑3:所以我将签出从快照移到了另一个签入中,但它仍然在创建2个文档。您在下面看到的代码位于其他代码之上。

代码语言:javascript
复制
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();
      }
    });
EN

回答 1

Stack Overflow用户

发布于 2018-07-06 03:13:54

预计您的快照侦听器将触发两次。

第一次将为您提供集合的初始内容。然后,在createNewMonth()函数中,向同一集合添加一个新文档。然后,快照侦听器将在更新集合内容时触发第二次,该集合现在包含您刚刚添加的文档。

您应该知道,侦听器函数接收的snapshot上没有length属性。这不是有效代码:

代码语言:javascript
复制
if (snapshot.length <= 0) {
  this.createNewMonth();
}

snapshot是一个QuerySnapshot对象。如果您想知道快照中有多少个文档,请使用其size属性或empty属性。

此外,如果您不想持续监视集合中的此类更改,请考虑在集合引用上使用get(),而不是像现在这样添加侦听器。它将为您提供单次的一组结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51198094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档