首页 > 解决方案 > 如何在 Android 上使用 whereArrayContains() 过滤器查询包含 Firestore 集合中对象数组的文档?

问题描述

我在 firestore 中有一个集合,其中每个文档都包含一组联系人,我想查询那些联系人的电子邮件 ID 为特定值的文档。

我在https://firebase.google.com/docs/reference/android/com/google/firebase/firestore/Query#whereArrayContains(java.lang.String,%20java.lang.Object)遇到 whereArrayContains() 过滤器,带有以下描述:-

public Query whereArrayContains (String field, Object value)
创建并返回一个带有附加过滤器的新查询,该过滤器文档必须包含指定的字段,值必须是一个数组,并且该数组必须包含提供的值。

一个查询只能有一个 whereArrayContains() 过滤器。

上述方法中的可以value指向对象数组的对象内的字段吗?

此外,考虑到方法参数也称为 ,该短语the value must be an array有点令人困惑value。我确信文档意味着field应该存在于文档中,并且它的值应该是一个数组,并且该数组应该包含value参数。

标签: androidfirebasegoogle-cloud-firestore

解决方案


您不能在 Firestore 查询中查询数组中对象的字段。包含数组的查询将改为与数组中的对象进行比较。

该值必须是一个数组

这是指您尝试查询的字段的值。更好的措辞是

创建并返回一个带有附加过滤器的新查询,该过滤器文档必须包含指定的字段,指定字段的值必须是一个数组,并且该数组必须包含提供的值。

如果您尝试过滤用户 ID 或类似内容,请考虑将第二个数组添加到您正在查询的对象,然后将 ID 作为字符串添加到该数组:

{
    "name": "test",
    "users": [someUserObject, someOtherUserObject],
    "userIds": ["someId", "someOtherId"]
}

然后查询该数组:

someRef.whereArrayContains("userIds", someId);

推荐阅读