Firebase Firestore:按文档数组中的项进行查询

Firebase Firestore:按文档数组中的项进行查询,firebase,google-cloud-platform,google-cloud-firestore,data-modeling,Firebase,Google Cloud Platform,Google Cloud Firestore,Data Modeling,我有一个文档“user”,它有一个名为“photos”的键。下面是保存的字符串数组,即“photo”文档的ID 我想通过此“照片”字段查询“用户”:我想在“照片”属性中查询具有此ID的所有用户 通过firestore可以吗 请参阅,因为我们没有使数组包含查询可用 不幸的是,现在还没有,尽管这已经在我们的路线图上了 同时,您需要使用以下形式的地图: photos: { id1: true id2: true } 现在,您可以通过过滤photos.id1==true找到所有具有id

我有一个文档“user”,它有一个名为“photos”的键。下面是保存的字符串数组,即“photo”文档的ID

我想通过此“照片”字段查询“用户”:我想在“照片”属性中查询具有此ID的所有用户

通过firestore可以吗

请参阅,因为我们没有使数组包含查询可用

不幸的是,现在还没有,尽管这已经在我们的路线图上了

同时,您需要使用以下形式的地图:

photos: {
    id1: true
    id2: true
}
现在,您可以通过过滤
photos.id1==true
找到所有具有id1的用户


在中阅读有关查询此类集合的更多信息。

这里是对答案的一点扩展,因为有些人似乎对必须为每个键创建索引感到困惑,Firestore已经为您的数据编制了索引以进行简单查询,因此您可以执行以下简单查询:

documentReference.where('param','==','value').onSnapshot(...)
但是,除非为这些参数的数据编制索引,否则不能执行复合查询。因此,您需要索引才能执行以下操作:

 documentReference.where('param','==','value').where(..otherparams...).onSnapshot(...)
因此,只要您需要照片作为身份证,您就可以将其另存为

usersCollection :                        (a collection)
    uidA:                                (a document)
         photoField:                     (a field value that is a map or object)
            fieldID1 : true              (a property of the photoField)
            fieldID2 : true              (a property of the photoField)
            etc ...  
您可以简单地查询在其photoField中有fieldID1的用户,而不需要形成任何索引,就像下面的查询一样

firestore.doc('usersCollection/uidA').where('photoField.fieldID1','==',true).onSnapshot(...)
添加了与.where()一起使用的“array contains”查询运算符,以查找数组字段包含特定元素的文档

5.3.0

更新:也可在
@googlecloud/firestore
中找到:

更新2


更新3现已在Admin Node.js SDK v6.0.0中提供自2019年11月起,Firestore已添加了一个“in”查询。 根据:

使用in查询,可以查询特定字段中的多个值 (最多10)在单个查询中。您可以通过传递一个包含 您要搜索的所有值都将与Cloud Firestore匹配 字段等于这些值之一的任何文档


这个路线图是在什么地方发布的吗?只是好奇。@DanMcGrath此功能/路线图是否有任何更新?Firestore不允许我在不索引每个可能的id的情况下以这种方式查询数据。是否有某种方法不需要索引,或拥有动态索引?@KevinBeal提到的最大问题是,如果需要复合查询,您可以索引键。对于任何高级查询功能来说,这都是一个非常重要的破坏者。@Dan McGrath确实如此,但仅限于一个参数。你可以做
。where('photos','array contains','id1')
但你不能做
。where('photos','array contains',['id1','id2'])
这太棒了。谢谢你的介绍。Welp花了一段时间:D我在做一个项目,我需要这个,我很高兴我落后了足够多,让firebase团队领先:pIt太棒了+1不幸的是,没有办法用很少的“array contains”值进行查询。@Henry,是的,我试过了。Firebase服务器以错误响应我:FirebaseError:无效查询。查询仅支持单个数组包含筛选器。