Javascript 哪一种是执行单个文档的多个请求,还是执行500000个文档的单个请求(云Firestore)?

Javascript 哪一种是执行单个文档的多个请求,还是执行500000个文档的单个请求(云Firestore)?,javascript,firebase,react-native,google-cloud-firestore,Javascript,Firebase,React Native,Google Cloud Firestore,我想从云firestore中获取50个用户,我有两种方法都可以。 但事实上,我不知道这是什么表现,因为我们国家的互联网连接很差,,如果我们只关注抓取而不是迭代的话 第一种方式(单个请求) 第二种方式(多个请求) 使用第一种方法,您实际上是获取整个用户集合,并将所有相应的数据从后端(Firestore)传输到前端。这真的不是很有效,特别是如果你想过滤500k中的50个用户!还请注意,您将支付500K次读取,而不是50次读取(请参阅) 因此,仅获取您想要的文档(即,正好针对50个用户)是最有效的

我想从
云firestore
中获取50个用户,我有两种方法都可以。 但事实上,我不知道这是什么表现,因为我们国家的互联网连接很差,
,如果我们只关注抓取而不是迭代的话

  • 第一种方式(单个请求

  • 第二种方式(多个请求


  • 使用第一种方法,您实际上是获取整个用户集合,并将所有相应的数据从后端(Firestore)传输到前端。这真的不是很有效,特别是如果你想过滤500k中的50个用户!还请注意,您将支付500K次读取,而不是50次读取(请参阅)

    因此,仅获取您想要的文档(即,正好针对50个用户)是最有效的方法。由于该方法是异步的,并返回一个承诺,因此可以按如下方式使用:

    const matchingUsers = [user1, user2, user3, ..., user50];
    const promises = matchingUsers.map(u => db.collection('users').doc(u).get());
    
    Promise.all(promises).then(results => {
    
        //results is an array of DocumentSnapshots
        //use any array method, like map or forEach      
    
        results.map(docSnapshot => {
                console.log(docSnapshot.data());
        });
    });
    

    正如文档中所解释的那样,
    Promise.all()
    的优点是“它返回一个单个Promise,当作为iterable传递的所有承诺都已实现时,该承诺将实现”,这使得管理不同的异步并行调用变得非常容易。

    第一种方法,实际上,您正在获取整个用户集合,并将所有相应的数据从后端(Firestore)传输到前端。这真的不是很有效,特别是如果你想过滤500k中的50个用户!还请注意,您将支付500K次读取,而不是50次读取(请参阅)

    因此,仅获取您想要的文档(即,正好针对50个用户)是最有效的方法。由于该方法是异步的,并返回一个承诺,因此可以按如下方式使用:

    const matchingUsers = [user1, user2, user3, ..., user50];
    const promises = matchingUsers.map(u => db.collection('users').doc(u).get());
    
    Promise.all(promises).then(results => {
    
        //results is an array of DocumentSnapshots
        //use any array method, like map or forEach      
    
        results.map(docSnapshot => {
                console.log(docSnapshot.data());
        });
    });
    


    正如文档中所解释的那样,
    Promise.all()
    的优点是“当所有作为iterable传递的承诺都已实现时,它返回一个单个承诺,这使得管理不同的异步并行调用变得非常容易。

    有多少用户?@jonaswillms谢谢,我说我在
    云firestore
    中有50万用户,但我想匹配
    50个本地用户。然后如果匹配是真的,我检索这50个用户的数据。然后我猜迭代500000个条目比检索50个要慢得多。我测试了500k个用户的迭代,如果是在数组中,它的速度非常快,但实际上我不知道,一次获取时间(
    500k个用户
    )和一次获取性能。请不要迭代,在单个请求中获取500k用户很快,或者在50个请求中获取50个单文档??有多少用户?@Jonaswillms谢谢,我说过我在
    云firestore中有500k用户,但我想匹配
    50个本地用户。然后如果匹配是真的,我检索这50个用户的数据。然后我猜迭代500000个条目比检索50个要慢得多。我测试了500k个用户的迭代,如果是在数组中,它的速度非常快,但实际上我不知道,一次获取时间(
    500k个用户
    )和一次获取性能。请不要迭代,在单个请求中获取500k用户很快,或者在50个请求中获取50个单文档??非常感谢,如果我们从
    50k
    中筛选出50个用户,您能告诉我,为什么您使用
    map()函数
    ,如果我使用
    for
    更快,您认为如何。“如果我们从50k中筛选出50个用户呢”->这仍然不是最好的解决方案,特别是因为你说“我们国家的互联网连接很差”“。请注意,您将支付50K次读取,而不是50次!!如果您的收藏中只有75份文档,这可能是一个可行的选择,但要准确回答问题,我们需要知道每个文档的大小、您的确切互联网速度等。。。为了知道
    forEach
    map
    之间哪个更快,您应该再次进行一些测量。网络上的文献表明地图是更快的,更多的细节通过网络搜索。请考虑接受并投票赞成我的答案,请参阅。谢谢..forEach()没有每个迭代的返回值-.map()有。Promise.all()需要一系列承诺-因此您必须使用.map()非常感谢,如果我们从
    50k
    中筛选出50个用户,您能告诉我,您为什么使用
    map()函数
    ,如果我改为使用
    for
    的话,您会怎么想,如果速度更快的话。“如果我们从50k中筛选出50个用户呢?”->这仍然不是最好的解决方案,特别是因为你说“我们国家的互联网连接很差”。请注意,您将支付50K次阅读,而不是50次!!如果您的收藏中只有75份文档,这可能是一个可行的选择,但要准确回答问题,我们需要知道每个文档的大小、您的确切互联网速度等。。。为了知道
    forEach
    map
    之间哪个更快,您应该再次进行一些测量。网络上的文献表明地图是更快的,更多的细节通过网络搜索。请考虑接受并投票赞成我的答案,请参阅。谢谢..forEach()没有每个迭代的返回值-.map()有。Promise.all()需要一个承诺数组,因此必须使用.map()
    const matchingUsers = [user1, user2, user3, ..., user50];
    const promises = matchingUsers.map(u => db.collection('users').doc(u).get());
    
    Promise.all(promises).then(results => {
    
        //results is an array of DocumentSnapshots
        //use any array method, like map or forEach      
    
        results.map(docSnapshot => {
                console.log(docSnapshot.data());
        });
    });