【问题标题】:Firestore query 'array_contains' pass in array [duplicate]Firestore查询'array_contains'传入数组[重复]
【发布时间】:2020-02-13 08:12:15
【问题描述】:

我正在查看 Firebase、云 Firestore,但我不明白如何执行查询并传入数组。

const friendIds = [1, 2, 3];

Firestone.collection('conversations')
      .where('members', 'array-contains', friendIds)
      .get()
      .then(querySnapshot => console.log(querySnapshot))
      .catch(error => console.log(error));

有人知道如何实现吗?

【问题讨论】:

    标签: javascript firebase google-cloud-firestore


    【解决方案1】:

    这目前无法通过单个查询来实现。 array-contains 只能在命名数组中找到单个项目。

    您的替代方法是执行三个查询,一个查询friendsId 数组中的每个项目,然后将结果合并到您的代码中。

    【讨论】:

      【解决方案2】:

      不确定这是否可行,但这里有一个来自Firebase Node.js Snippets 的示例,可以为您提供一个想法:

        let citiesRef = db.collection('cities');
      
        // [START array_contains_filter]
        let westCoastCities = citiesRef.where('regions', 'array-contains',
          'west_coast');
      
        // [END array_contains_filter]
      
        westCoastCities.get()
          .then(res => {
            console.log('West Coast get: ', res);
          });
      

      参考Documentation

      【讨论】:

        【解决方案3】:

        根据query operators的官方文档:

        您可以使用数组包含运算符根据数组值进行过滤。

        正如我在您的代码中看到的,作为第三个参数传递给where() 函数的friendIds 参数的类型为array。您实际上在做什么,您正在搜索数组类型为数组的members 属性,这实际上是不可能,因为我假设您的数据库中的members 数组包含数字。

        这样的查询:

        Firestone.collection('conversations')
              .where('members', 'array-contains', 3)
              .get()
              .then(querySnapshot => console.log(querySnapshot))
              .catch(error => console.log(error));
        

        可以正常工作,因为我们正在 members 数组中搜索一个数字。

        如果您需要查询所有这些数字,您应该执行三个单独的查询并将结果合并到客户端。

        【讨论】:

        • 您好 virtualLast!我可以帮助您了解其他信息吗?如果您认为我的回答对您有所帮助,请考虑采纳(✔️)。我真的很感激。谢谢!
        猜你喜欢
        • 1970-01-01
        • 2021-12-04
        • 1970-01-01
        • 1970-01-01
        • 2019-02-02
        • 1970-01-01
        • 1970-01-01
        • 2019-10-18
        • 2021-10-17
        相关资源
        最近更新 更多