【问题标题】:Firebase: Firestore index for searching across multiple collectionsFirebase:用于跨多个集合搜索的 Firestore 索引
【发布时间】:2020-07-24 18:44:52
【问题描述】:

这几天我一直在努力解决这个问题。抱歉,如果这是一个重复。 按照https://firebase.google.com 的指南,我创建了/users/ 集合,其中包含每个用户的文档,例如

/users/<user1>/
/users/<user2>/

每个文档中有数百个字段,例如

user1 = {key1: value1, key2: value2, ..., key100: value100}

我希望能够在所有用户中搜索多个字段 - 即集合组搜索,如文档中所述。 这是这样的:

firebase.firestore().collection("users")
    .where("key1", ">=", val1)
    .where("key2", "<=", val2)
    .where("key3, "==", "val3")
    .get()
    .then(function(querySnapshot) {
        querySnapshot.forEach(function(doc) {
            // doc.data() is never undefined for query doc snapshots
            console.log(doc.id, " => ", doc.data());
        });
        console.log("didn't get anything?")
    })
    .catch(function(error) {
        console.log("no match found: ", error);
        return false;
    });

我希望能够对任意一组键执行此操作。似乎firestore为此需要一个复合索引。 问题是为每个键组合创建索引是不切实际的。假设我希望能够搜索多达 10 个键 - 这将需要 C(100, 1) + C(100, 2) +...+C(100, 10) 索引数,其中 C 是组合选择。

我可能想错了,因为这似乎是一个常见的用例。正如您所猜测的,我希望用户能够在给定一组标准的情况下找到其他用户。任何建议表示赞赏。

仅供参考,当我运行上述查询时,我收到此错误:

找不到匹配项:FirebaseError:查询需要索引。你可以在这里创建它:https://console.firebase.google.com/v1/r/project//firestore/indexes?create_composite=

我正在使用 JavaScript 开发基于 Web 的应用程序,如果这很重要的话。

【问题讨论】:

  • 那么您是否按照链接创建索引?
  • 另外我在这里没有看到为什么这需要一个集合组查询。如果您只有一个名为“用户”的顶级集合,那么您根本就没有集合组。只需按照您在文档中看到的那样正常查询一个集合。您通常使用集合组来查询同名的子集合。
  • 是的,我按照链接创建了索引。关键是我的键是动态的,所以我必须创建太多索引。用户可以选择任意 n 个键进行搜索。
  • 关于收藏组 - 是的,我弄错了。我想如果我想搜索所有组 /users/user1、/users/user2、/users/user3,我需要一个集合组查询。编辑问题以澄清这不是集合组查询。
  • 如果您的键是动态的,那么除了重组数据以支持使用更可预测/常规键的查询之外,您无能为力。

标签: javascript firebase google-cloud-firestore


【解决方案1】:

似乎由于复合索引的限制,这样搜索是不可行的。

但是,也许如果您探索另一种加载集合的方式,以及在元素中搜索/迭代的方式,您可以采用不同的方法。 .

.then(function(querySnapshot) {
        querySnapshot.forEach(function(doc) {
            // doc.data() is never undefined for query doc snapshots
            console.log(doc.id, " => ", doc.data());
        });
        console.log("didn't get anything?")
    })

我了解执行此操作的最佳途径是使用库,但有时开发自己的解决方案也很棒。

【讨论】:

  • 您的意思是提供更长的示例吗?我只看到 .then 部分
猜你喜欢
  • 1970-01-01
  • 2019-03-07
  • 1970-01-01
  • 2019-03-01
  • 2016-09-25
  • 2014-07-31
  • 2020-10-17
  • 1970-01-01
  • 2021-04-17
相关资源
最近更新 更多