如何在Angularfire中按动态对象属性进行过滤

如何在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

在AngularFire+Firestore项目中,我有一个如下的模型

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)