【发布时间】: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