当前位置: 首页 > 知识库问答 >
问题:

在web javascript中获取云firestore集合的快照大小[重复]

马泰
2023-03-14

我正在用javascript开发一个web应用程序,使用云firestore作为数据库。在我的数据库中,一个集合中有大约40万个文档。当我编写查询以获取快照大小时,我的网站将进入调试状态,永远不会返回大小。

db2.collection("Products").get().then(function(querySnapshot) {
   querySnapshot.forEach(function(doc) {
      // console.log(doc.id, " => ", doc.data());
   });
   console.log("size",querySnapshot.size);
})
.catch(function(error) {
   console.log("Error getting documents: ", error);
});

因此,我编写了另一个类似下面的查询,使用带有查询游标的分页数据。

var productfirst = db2.collection("Products").orderBy("ProductName").limit(10000);

getProducts(productfirst);
    
function getProducts(first){
    
   first.get().then(function (documentSnapshots) {
       // Get the last visible document
       pcount = pcount + documentSnapshots.size;
       console.log("products",documentSnapshots.size,pcount);
       var lastVisible = documentSnapshots.docs[documentSnapshots.docs.length-1];
    
       document.getElementById('totalProducts').textContent = pcount;
    
       if(documentSnapshots.size == 0){
           document.getElementById('totalProducts').textContent = pcount;
           // document.getElementById("loadspinner").style.display = "none";
       }
       else {
           // Construct a new query starting at this document, get the next 25 cities.
           var next = db2.collection("Products").orderBy("ProductName").startAfter(lastVisible)
                      .limit(10000);
    
           getProducts(next);
       }
    });
}

这个查询返回快照大小,但它需要超过5分钟来获得总数。有没有其他更快的方法来获得firestore收集的大小?而且,我需要将这些文档设置为数据表。

共有1个答案

荆学民
2023-03-14

由于Firebase Cloud Firestore根据文件阅读量向您收费,这将使您的账单增加到天文数字。我建议您创建一个文档来存储这些统计数据。这可以使用与onCreate和OnDelete数据库触发器配对的fieldvalue功能来完成。

以下是上述云功能的实现参考

// IMPORT
const functions = require('firebase-functions');
const admin = require('firebase-admin');

// INIT
const firebaseApp = admin.initializeApp(yourConfig)
var db = firebaseApp.firestore();
var fieldVal = admin.firestore.FieldValue;


// INCREMENT UPON CREATION
exports.makeUppercase = functions.firestore.document("/Products/{productID}").onCreate((handler, context)=>{
    db.collection("statistics").doc("products").update({
        nProducts: fieldVal.increment(1)
    })
})

// DECREMENT UPON DELETION
exports.makeUppercase = functions.firestore.document("/Products/{productID}").onDelete((handler, context)=>{
    db.collection("statistics").doc("products").update({
        nProducts: fieldVal.increment(-1)
    })
})

或者,您也可以在产品管理面板上使用上述增量和减量功能,以消除对云功能的需求。只需确保您事先创建了统计文档。

 类似资料:
  • 假设我们有一个名为'Todos'的根集合。 此集合中的每个文档都有: null null

  • 如何从拥有数千个文档的Firestore集合中有效地获得整个查询大小? 在我的例子中,我通过几种不同的规则查询文档: 开始日期 结束日期 位置ID 关键字 我可以使用云函数进行与前面相同的查询,但没有限制,然后得到它的大小,但有没有更有效的方法做到这一点?查询大小可能是数千个文档,那么这样做是否存在性能问题?在这种情况下,帐单是如何工作的? 如果。我的查询是1500个文档,是否需要1500个读取操

  • 如果我有一个Firebase Firestore数据库,我已为右侧集合对应的文档检索到文档快照,并存储在文档变量中,那么我如何在“用户名”字段检索该文档快照中的值?该字段具有字符串值。

  • 问题内容: 我想从Firebase Firestore数据库获取数据。我有一个名为user的集合,每个用户都有一些相同类型的对象(My Java自定义对象)的集合。我想在创建我的活动时用这些对象填充ArrayList。 在onCreate()中: 调用以获取项目列表的方法: 问题答案: 该操作返回a ,这意味着它是一个 异步操作 。调用仅启动操作,它不等待操作完成,因此您必须添加成功和失败侦听器。

  • 我已经阅读了下面的所有问题,但在文档中找不到任何描述如何同步集合并只从集合中接收更改的文档的内容。我的同步集合中有500多个文档(使用redux-saga-firebase syncCollection),但通常只有大约100个文档会改变。在任何给定的时间,甚至更少的会改变,但我目前得到所有500+文档,当即使有一个改变,这导致500+读取。不理想,会让我付出代价。 下面是我使用redux-sag

  • 我正在尝试优化我的应用程序在Firesbase上的读取次数,并回顾我使用快照监控实时更改的方式。假设我有一个快照,返回10个最新文档,如下所示: 医生说 每次查询结果更改时(即添加、删除或修改文档时),快照处理程序都会收到一个新的查询快照。 这是否意味着每次查询更改时,我都将被计费10次读取?在这个例子中,如果添加了一个新城市(所以使用最新的“日期添加”,所以在查询中排在第一位),它将是1(只是新