如何使用JavaScript有条件地将过滤器应用于Firestore查询

时间:2018-09-03 18:42:11

标签: javascript firebase vue.js google-cloud-firestore

我稍作休息,可以看到我的if语句被正确命中,但是返回数据没有考虑其他where子句。基本上,如果这是开始月份,我不希望它有一个起点,只返回不完整的月份。之后,我希望它一次只退回一个月。

我还验证了我的日期值正确。

let endDate = moment(date).add(1, 'M').toDate()
var search = fb.ledgersCollection.where('accountId', '==', this.account.id)
                    .where('completed', '==', false)
                    .where('date', '<', endDate)


if(date != this.startDate) {
    search.where('date', '>', date)
}

search.orderBy('date', 'asc').orderBy('deposit', 'desc').orderBy('name', 'asc').get().then(docs => {

    docs.forEach(doc => {

        let ledger = doc.data()
        ledger.date = new Date(1000* doc.data().date.seconds)
        ledger.id = doc.id
        this.currentBalance = parseFloat(Number(this.currentBalance) + Number(ledger.amount)).toFixed(2)
        ledger.balance = this.currentBalance
        this.ledgerItems.push(ledger)
    })
})

1 个答案:

答案 0 :(得分:3)

Firestore中的查询对象是不可变的,这意味着它们在创建后无法修改。您需要做的是在先前查询的基础上建立一个新查询。例如:

var search = fb.ledgersCollection.where('accountId', '==', this.account.id)
                    .where('completed', '==', false)
                    .where('date', '<', endDate)


if(date != this.startDate) {
    // build a new query based off the original query
    search = search.where('date', '>', date)
}

请注意,我正在将search重新分配给基于原始搜索的新查询对象。这项新搜索将同时应用所有过滤器。