Firestore按UID作为嵌套对象键查询文档失败问题求助
解决Firestore嵌套对象键存在性查询问题
嘿,我来帮你搞定这个Firestore查询的问题!你原来的思路是对的——通过拼接用户UID作为嵌套对象的键路径来关联查询,但问题出在查询条件的写法上。
原代码的问题
你写的ref.where(\application.members.${this._auth.currentUserId}`, '==', !null)里,!null在JavaScript里会被解析成布尔值true,但Firestore并不会把“某个键存在”等同于这个键的值为true。如果你的application.members.UID`对应的是其他类型的值(比如对象、字符串),这个条件就匹配不到任何文档。
正确的查询写法
Firestore专门提供了exists操作符来检查某个字段/路径是否存在,不管它的值是什么。你只需要把查询条件改成这样:
getAllTenancyOffersByUserId() { const userId = this._auth.currentUserId; // 先确保userId不为空,避免无效查询 if (!userId) return null; return this.afs.collection('collection_name', ref => ref.where(`application.members.${userId}`, 'exists', true) ); }
为什么这样有效
exists: true会告诉Firestore:只要文档中存在application.members.当前用户UID这个路径(不管对应的值是对象、字符串还是其他),就把这个文档返回。- 我加了一个
userId的空值检查,避免因为用户未登录导致userId为空,生成无效的查询路径(比如application.members.undefined)。
额外提醒
如果你的application.members是一个数组而不是对象的话,这个方法不适用,但从你的描述来看它是键为UID的对象,所以这个方案完全适配你的场景。
内容的提问来源于stack exchange,提问作者Jm3s
相关产品推荐
相关产品推荐

