Firestore中如何筛选集合内数组?书签内容筛选代码报错求助
解决Firestore集合数组筛选问题
我来帮你排查这个问题!你的查询写法确实存在错误,因为Firestore对数组的查询逻辑和嵌套对象不一样,不能直接用BookmarkedBy.UserID这种方式来筛选数组内的对象属性。
问题根源
你当前的.where("BookmarkedBy.UserID", "==", "hvC2WQL5JJG3Hbq1hxJe")写法,Firestore会理解为查找名为BookmarkedBy的嵌套对象,且该对象的UserID字段等于目标值,但实际上BookmarkedBy是一个数组,所以这种查询不会返回任何匹配结果。
正确解决方案
根据你的数据结构,分两种情况处理:
情况1:BookmarkedBy是对象数组(如[{UserID: "xxx"}, ...])
如果你的数组元素是包含UserID的对象,需要使用array-contains查询,并且传入完整的匹配对象(键名、类型必须完全一致,不能有额外字段):
this.contentList = afs.collection<Content>('Content', ref => ref .where('isActive', '==', true) .where("BookmarkedBy", "array-contains", { UserID: "hvC2WQL5JJG3Hbq1hxJe" }) ) .snapshotChanges().map(actions => { return actions.map(a => { const data = a.payload.doc.data() as Content; data.$key = a.payload.doc.id; return { ...data }; }); });
情况2:优化数据结构(更推荐)
如果你的需求只是记录哪些用户收藏了内容,建议把BookmarkedBy改成字符串数组(直接存储用户ID,如["hvC2WQL5JJG3Hbq1hxJe", ...]),这样查询更简单高效:
修改后的查询代码:
this.contentList = afs.collection<Content>('Content', ref => ref .where('isActive', '==', true) .where("BookmarkedBy", "array-contains", "hvC2WQL5JJG3Hbq1hxJe") ) .snapshotChanges().map(actions => { return actions.map(a => { const data = a.payload.doc.data() as Content; data.$key = a.payload.doc.id; return { ...data }; }); });
额外提示
array-contains只能匹配数组中完全相等的元素,所以如果是对象数组,必须确保传入的对象和数组内的对象完全一致(比如不能多字段、少字段,键名大小写也要匹配)。- 如果你需要同时筛选多个用户ID,可以使用
array-contains-any,传入ID数组即可(如.where("BookmarkedBy", "array-contains-any", ["id1", "id2"]))。
内容的提问来源于stack exchange,提问作者Abdul Qayyum
相关产品推荐
相关产品推荐

