为了在集合中使用“复杂”查询,我尝试从Firebase实时数据库迁移到Cloud,但我发现了一些我不知道如何解决的“问题”。
我的服务器使用Express JS和Firebase Admin。我试图为我的管理仪表板创建一个CRUD路由器,但是我得到了以下错误:
"9 FAILED_PRECONDITION:查询需要一个索引。
当我访问那个URL (.)我犯了一些错误我没有足够的权限..。无论如何,经过一些研究后,我了解到“复杂”查询需要索引,而且它们必须不止一个。
这是我当前的路由器代码,您可以看到我想要实现的目标:
// GET - Get users
router.get('/', async (req: Request, res: Response) => {
...
let ref: any = db.collection('users').orderBy('createdAt');
Object.keys(req.query).forEach(key => {
ref = ref.where(key, '==', req.query[key]);
});
...
});正如您所看到的,当我迭代req.query键时,我正在向查询中添加一个条件语句。我的想法是从客户端逐步添加自定义过滤器。
根据我从文档中理解的内容,我应该为每个文档属性创建一个复杂的索引类型。
因此,我应该怎么做才能实现上述的想法?提前谢谢。
发布于 2020-04-01 05:54:44
Firestore复合查询有一些限制。一个是要使用多个方法,例如"where“和"orderBy",您需要为这个查询创建一个索引。
因此,在您的情况下,由于您的查询是动态的,您必须为每个查询创建一个索引。我的建议是,您只在查询中使用"where“,在其他过滤器中使用javascript进行筛选。或者迁移到另一个数据库,如MongoDB。
这是用于解释复合查询的Fi还原文档的链接:https://firebase.google.com/docs/firestore/query-data/queries?hl=en-us
https://stackoverflow.com/questions/60963837
复制相似问题