我有2个收藏**"照片"和"用户","用户"中的每个文档都有一个或多个带有数组的照片ID**。
photos > 5528c46b > name: "Photo1"
a1e820eb > name: "Photo2"
32d410a7 > name: "Photo3"
users > acd02b1d > name: "John", photos: ["5528c46b"]
67f60ad3 > name: "Tom", photos: ["5528c46b", "32d410a7"]
7332ec75 > name: "Sara", photos: ["a1e820eb"]
9f4edcc1 > name: "Anna", photos: ["32d410a7"]
我想获取具有一个或多个特定照片ID的所有用户。
有什么办法可以做到吗?
5条答案
按热度按时间pbwdgjma1#
查看亨利的答案,因为我们还没有提供数组包含查询。
不幸的是,还没有,尽管它在我们的路线图上。
同时,您需要使用Map,其形式为:
现在您可以通过
photos.id1 == true
过滤找到所有id1的用户。阅读Firebase文档中有关查询此类集合的详细信息。
v8wbuo2f2#
添加了“array-contains”查询运算符,用于与.where()一起查找数组字段包含特定元素的文档。
https://firebase.google.com/support/release-notes/js 5.3.0
更新:
@google-cloud/firestore
中也提供:https://github.com/googleapis/nodejs-firestore/releases/tag/v0.16.0更新2https://firebase.googleblog.com/2018/08/better-arrays-in-cloud-firestore.html
更新3现在可在管理节点. js SDK v6.0.0 https://github.com/firebase/firebase-admin-node/releases中获得
mwngjboj3#
这里对答案进行了一些扩展,因为有些人似乎对必须为每个键创建索引感到困惑,Firestore已经为简单查询创建了数据索引,因此您可以执行如下简单查询
但是你不能进行复合查询,除非你为这些参数建立索引。2所以你需要索引来完成类似的事情:
因此,只要你需要照片的身份证,你可以保存为
并且您可以简单地查询在其photoField中具有fieldID1的用户,而无需形成任何索引和类似下面的查询。
fcwjkofz4#
截至2019年11月,Firestore现在已经增加了一个“in”查询,根据the announcement article:
使用in查询,您可以在一个查询中查询特定字段的多个值(最多10个),方法是传递一个包含所有要搜索的值的列表,Cloud Firestore将匹配字段等于这些值之一的任何文档。
gev0vcfq5#
使用Firebase版本9(2021年12月更新):
您可以将**“array-contains”与“while()"中的一个照片文档ID一起使用,以获取拥有该文档ID的所有用户**:
您还可以将**“array-contains-any”与一个或多个照片文档ID(在**“while()"中带有数组)一起使用,以获取更多对应的用户: