Firestore array-contains-any 无法正常工作
Firestore array-contains-any is not working properly
"@angular/fire": "5.2.3",
"firebase": "7.4.0",
注:members
是一个array
,0,1,2是map
数据结构。
service.ts
getUserChatGroups(uid: string): Observable<DocumentChangeAction<MessageGroupMemberModel>[]> {
return this.afs.collection<MessageGroupMemberModel>(`messageGroups`, ref => ref.where('members', 'array-contains-any', [uid])).snapshotChanges();
}
page.ts
init(): void {
const uid: string = this.authService.getUserUid();
this.chatService.getUserChatGroups(uid).subscribe(res => {
console.log(res);
},
err => console.log(err),
() => console.log('request completed')
);
}
没有错误。但它 return 没有任何价值。但它具有价值。我的查询有问题吗?
array-contains-any
(以及 array-contains
)运算符检查数组是否包含与您传递给调用的信息匹配的元素。因此,在您的情况下,您需要同时传递 id
和 joinDateTime
才能匹配。
ref.where('members', 'array-contains-any', [{ id: uid, joinedDateTime: ... }])
如果您不知道用户的 joinedDateTime
,则无法查询当前数据结构中的数组。正常的解决方案是在文档中也存储一个单独的数组字段 memberIds
,它只包含成员的 UID。然后你可以通过查询 that 字段来找到成员:
ref.where('members', 'array-contains', [uid])
或
ref.where('members', 'array-contains-any', [uid, uid2, uid3])
"@angular/fire": "5.2.3",
"firebase": "7.4.0",
注:members
是一个array
,0,1,2是map
数据结构。
service.ts
getUserChatGroups(uid: string): Observable<DocumentChangeAction<MessageGroupMemberModel>[]> {
return this.afs.collection<MessageGroupMemberModel>(`messageGroups`, ref => ref.where('members', 'array-contains-any', [uid])).snapshotChanges();
}
page.ts
init(): void {
const uid: string = this.authService.getUserUid();
this.chatService.getUserChatGroups(uid).subscribe(res => {
console.log(res);
},
err => console.log(err),
() => console.log('request completed')
);
}
没有错误。但它 return 没有任何价值。但它具有价值。我的查询有问题吗?
array-contains-any
(以及 array-contains
)运算符检查数组是否包含与您传递给调用的信息匹配的元素。因此,在您的情况下,您需要同时传递 id
和 joinDateTime
才能匹配。
ref.where('members', 'array-contains-any', [{ id: uid, joinedDateTime: ... }])
如果您不知道用户的 joinedDateTime
,则无法查询当前数据结构中的数组。正常的解决方案是在文档中也存储一个单独的数组字段 memberIds
,它只包含成员的 UID。然后你可以通过查询 that 字段来找到成员:
ref.where('members', 'array-contains', [uid])
或
ref.where('members', 'array-contains-any', [uid, uid2, uid3])