如何在Angularfire中按动态对象属性进行过滤
在AngularFire+Firestore项目中,我有一个如下的模型如何在Angularfire中按动态对象属性进行过滤,angular,firebase,google-cloud-firestore,angularfire,Angular,Firebase,Google Cloud Firestore,Angularfire,在AngularFire+Firestore项目中,我有一个如下的模型 export interface Game { id: string; ... some other properties players: Array<{ userId: string; name: string; picture: string; }>; playerIds: { [userId: string]: boolea
export interface Game {
id: string;
... some other properties
players: Array<{
userId: string;
name: string;
picture: string;
}>;
playerIds: { [userId: string]: boolean };
}
然后它要求我为这个查询创建一个索引。问题是索引对于该用户非常特定,并且包含了该特定的用户id
在我的另一个在nodejs中使用firebase的项目中,我一次又一次地做了同样的事情,但在AngularFire中似乎有所不同
我知道如果我将其更改为用户ID数组,我可以通过
array contains
查询,我的问题是为什么这不起作用以及如何使它起作用。屏幕截图中的playerIds
字段不是数组,而是一个带有键bTr2…
和lnm4…
的地图,并且值为true
。不幸的是,对于该映射中的每个字段,都需要单独的索引
要使用单个索引,请将playerIds
字段转换为实际数组:
playerIds: ["bTr2...", "lnm4..."]
使用此结构,您可以:
- 在
字段上,只需要一个索引playerIds
- 可以使用
数组包含的内容进行查询
- 可以使用
将项目添加到数组中arrayUnion
- 使用
从阵列中删除项目arrayRemove
另请参阅上的文档。虽然Frank van Puffelen的解决方案正在运行,但我发现了问题所在 似乎如果我们有多个
,其中
或顺序
需要索引,那么问题是不可避免的。就我而言,我发现我应该使用==
而不是=代码>在第二个中,当我更改它时,它不需要任何索引,我可以这样查询
ref.where(`playerIds.${user.id}`, '==', true).where(`status`, '==', GameStatus.Started)
感谢您的回答,虽然您的解决方案会起作用,但我刚刚找出了问题的根本原因并开始起作用,问题是的组合=代码>状态过滤器,当我同时删除它时,它开始工作。所以我把状态过滤器移到了rxjs mapGood,听说你在@Reza找到了答案。我标记了您的答案和正确的解决方案,因为如果需要索引,似乎没有办法
ref.where(`playerIds.${user.id}`, '==', true).where(`status`, '==', GameStatus.Started)