Firestore addSnapshotListener在添加新文档时查询所有数据-Android

Firestore addSnapshotListener在添加新文档时查询所有数据-Android,android,google-cloud-firestore,Android,Google Cloud Firestore,我使用firestore来保存对象,但我意识到当一个新文档添加到集合中时,firestore的读取配额会随着查询返回的文档数量的增加而增加。我用错误的方式阅读firestore吗?有没有更好的方法来减少读数的数量 我的意思是有这样一种方法,如果查询正确,只检查新添加的文档,如果是,则返回此文档并添加到arraylist。我问这个问题是因为如果查询返回50个项目,那么新文档添加的配额将减少50。如果增加10份新文件,配额将增加500份 Query transactionsQuery = IOTr

我使用firestore来保存对象,但我意识到当一个新文档添加到集合中时,firestore的读取配额会随着查询返回的文档数量的增加而增加。我用错误的方式阅读firestore吗?有没有更好的方法来减少读数的数量

我的意思是有这样一种方法,如果查询正确,只检查新添加的文档,如果是,则返回此文档并添加到arraylist。我问这个问题是因为如果查询返回50个项目,那么新文档添加的配额将减少50。如果增加10份新文件,配额将增加500份

 Query transactionsQuery = IOTransactions
            .whereLessThan("timestamp", dateOfToday())
            .whereGreaterThan("timestamp", findDaysAgo())
            .orderBy("timestamp", Query.Direction.DESCENDING)
            .limit(40);
    transactionsQuery.addSnapshotListener(new EventListener<QuerySnapshot>() {
        @Override
        public void onEvent(@javax.annotation.Nullable QuerySnapshot queryDocumentSnapshots, @javax.annotation.Nullable FirebaseFirestoreException e) {
            if (e != null) {
                Log.w("FirestoreDemo", "Listen failed.", e);
                return;
            }

            for (DocumentChange dc : queryDocumentSnapshots.getDocumentChanges()) {
                switch (dc.getType()) {
                    case ADDED:
                        Log.d(TAG, "New city: " + dc.getDocument().getData());
                        transactionsList.add(dc.getDocument().toObject(StockTransaction.class));
                        break;
                    case MODIFIED:
                        Log.d(TAG, "Modified city: " + dc.getDocument().getData());
                        break;
                    case REMOVED:
                        Log.d(TAG, "Removed city: " + dc.getDocument().getData());
                        transactionsList.remove(dc.getDocument().toObject(StockTransaction.class));
                        break;
                }
            }
querytransactionquery=IOTransactions
.whereLessThan(“时间戳”,dateOfToday())
。其中大于(“时间戳”,findDaysAgo())
.orderBy(“时间戳”,Query.Direction.DESCENDING)
.限额(40);
TransactionQuery.addSnapshotListener(新的EventListener(){
@凌驾
public void onEvent(@javax.annotation.Nullable QuerySnapshot queryDocumentSnapshots,@javax.annotation.Nullable FirebaseFirestoreException e){
如果(e!=null){
Log.w(“FirestoreDemo”,“侦听失败”,e);
返回;
}
对于(DocumentChange dc:queryDocumentSnapshots.getDocumentChanges()){
开关(dc.getType()){
案件补充:
Log.d(标签,“新城:+dc.getDocument().getData());
添加(dc.getDocument().toObject(StockTransaction.class));
打破
案例修改:
Log.d(标记“修改的城市:”+dc.getDocument().getData());
打破
已删除的案例:
Log.d(标记“删除的城市:”+dc.getDocument().getData());
transactionList.remove(dc.getDocument().toObject(StockTransaction.class));
打破
}
}

在检查代码和配额时,我意识到如果我使用whereLessThan和wheregreatherthan方法,读取计数为40,这是一个极限值。但是如果我删除where方法,读取计数仅为1。我认为这似乎是一个错误,因为查询只能检查添加的元素。例如,当新文档添加到此集合时,请检查它的qu呃,如果查询为true,则返回新添加的文档,如果为false,则不执行任何操作。

您确定您确实按照您所说的那样为读取付费吗?如果您在查询中附加了一个侦听器,并且添加了一个新文档,则只应为一次新读取付费,但侦听器将在每次回调中为您提供所有要处理的文档。这些其他文档来自本地内存,不是在服务器上读取的。我不完全确定,但我只添加了大约50个文档,但在添加文档之前,读取配额增加到了1.5 k。如果您不清楚如何计费,或者认为存在错误,您应该直接联系Firebase支持。正如我所说,来自emory在使用时不应该计费。谢谢,我会尝试在这里写下答案。我想我发现了计数的问题。whereLessThan和Wheregreetherthan方法是问题所在。如果我不使用此方法并再次查询,则计数仅为1。但是如果我使用这些方法查询,则计数为40,这是我的极限方法的值。你认为呢nk这是一个问题吗?我认为这是一个错误,因为如果查询对该项正确,查询只能返回最后添加的项。你确定你真的按照你所说的那样为阅读付费吗?如果你有一个附加到查询的侦听器,并且添加了一个新文档,你应该只为一次新阅读付费,但侦听器将为你提供所有信息在每次回调中使用的文档。这些其他文档来自本地内存,而不是在服务器上读取。我不完全确定,但我只添加了大约50个文档,但在添加文档之前,读取配额增加到了1.5 k,即100个。如果您不清楚计费工作原理,或者认为存在错误,请联系Firebase支持部门正如我所说,来自内存的文档在使用时不应该计费。谢谢,我会尝试在这里写下答案。我想我发现了计数的问题。whereLessThan和whereGreaterThan方法是问题所在。如果我不使用此方法并再次查询,它只计算1。但是,如果我使用这些方法查询,它的计数为40 w这是我的极限方法的值。你认为这是一个问题吗?在我看来这是一个错误,因为如果查询正确的话,查询只能返回最后添加的项。