如何使用Android上的whereArrayContains()过滤器查询包含Firestore集合中对象数组的文档?

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

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

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

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

此外,由于方法参数也被称为 value ,因此短语 the value must be an array 有点混乱 . 我确信文档意味着 field 应该出现在文档中, its value 应该是一个数组,并且数组应该包含 value 参数 .

回答(2)

3 years ago

您无法在firebase查询中查询数组中对象的字段 . 相反,包含数组的查询将与数组中的对象进行比较 .

值必须是数组

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

创建并返回一个新的Query,其中包含文档必须包含指定字段的附加过滤器,指定字段的值必须是数组,并且数组必须包含提供的值 .

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

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

然后查询该数组:

someRef.whereArrayContains("userIds", someId);

3 years ago

根据文档,字段指向数组和值意味着您要检查的String是否存在于数组中 .

您可以使用array_contains运算符根据数组值进行过滤 . 例如:

CollectionReference citiesRef = db.collection("cities");
citiesRef.whereArrayContains("regions", "west_coast");

此查询返回每个城市文档,其中regions字段是包含west_coast的数组 . 如果数组具有您查询的值的多个实例,则文档仅包含在结果中一次 .

数据添加为: -

CollectionReference cities = db.collection("cities");

Map<String, Object> data1 = new HashMap<>();
data1.put("name", "San Francisco");
data1.put("state", "CA");
data1.put("country", "USA");
data1.put("capital", false);
data1.put("population", 860000);
data1.put("regions", Arrays.asList("west_coast", "norcal"));
cities.document("SF").set(data1);