【问题标题】:Firebase 'array-contains-any' more than 10 elementsFirebase 'array-contains-any' 超过 10 个元素
【发布时间】:2021-04-26 09:02:04
【问题描述】:

我的 Firestore 集合中的文档上存储了一个数组字段,我需要能够提取每个文档,其中数组字段包含多个选项之一。我只需要每次匹配一次,因此如果数组字段包含选项中的多个项目,我仍然只需要返回该文档的一份副本。目前我正在构建这样的查询:

query = collection.WhereArrayContainsAny('array-field', [1,2,3,4,...]);

我遇到的问题是提供的选项数组超过 10 个项目,因此查询失败。我可以将选项数组拆分为 10 个元素数组并多次运行查询,但我担心这会使查询需要很长时间才能执行,而且速度很重要。过去对人们有效的 10 项限制有什么办法吗?

【问题讨论】:

    标签: c# firebase google-cloud-firestore


    【解决方案1】:

    您可以并行运行多个查询调用并将结果合并到一个列表中:

    using System;
    using System.Collections.Generic;
    using System.Net.NetworkInformation;
    using System.Threading;
    using System.Threading.Tasks;
    
    public class Example
    {
       public static void Main()
       {
          int failed = 0;
          var tasks = new List<Task<QuerySnapshot>>();
          String[] filters = {1,2,3,4,5};
          
          foreach (var value in filters) {
        
             tasks.Add(Task.Run( async () => { 
               
                                         try {
                                           Query query = collection.WhereArrayContainsAny('array-field', [value]);
                                           QuerySnapshot querySnapshot = await museums.GetSnapshotAsync();
                                           return querySnapshot;
                                           
                                         }
                                         catch (Exception) {
                                            // handle exception
                                            throw;
                                         }
                                       })
                                       );
          }
          var continuation = Task.WhenAll(tasks);
          try {
             continuation.Wait();
          }
          catch (AggregateException)
          { }
       
          if (continuation.Status == TaskStatus.RanToCompletion) {
             List<QuerySnapshot> queries = new List<QuerySnapshot>()
    
            
    
             foreach (var result in continuation.Result) {
                 foreach (DocumentSnapshot document in result.Documents){
                  queries.add(document);
              }     
             }
      
          }
          // Display information on faulted tasks.
          else {
             foreach (var t in tasks) {
                Console.WriteLine("Task {0}: {1}", t.Id, t.Status);
             }
          }      
       }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-06-22
      • 2023-03-14
      • 2021-09-21
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      • 2021-11-01
      相关资源
      最近更新 更多