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

时间:2018-09-16 05:50:12

标签: android firebase google-cloud-firestore

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

我在https://firebase.google.com/docs/reference/android/com/google/firebase/firestore/Query#whereArrayContains(java.lang.String,%20java.lang.Object)遇到了whereArrayContains()过滤器,内容如下:-

  

公共查询whereArray包含(字符串字段,对象值)   
创建并返回一个新的查询,其中包含文档必须包含的其他过滤器   包含指定的字段,该值必须是一个数组,并且   数组必须包含提供的值。

     

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

上述方法中的value能否指向对象内部的对象数组?

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

3 个答案:

答案 0 :(得分:3)

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

  

该值必须为数组

这是指您要查询的字段的值。对此最好的措辞是

  

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

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

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

然后查询该数组:

someRef.whereArrayContains("userIds", someId);

答案 1 :(得分:0)

根据文档,该字段指向数组,值表示要检查的字符串是否存在于数组中。

  

您可以使用array_contains运算符基于数组进行过滤   价值观。例如:

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

此查询返回地区字段为   包含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);

答案 2 :(得分:0)

正如其他人所说,你所要求的不可能做到。

“Firebase-y”方法可以做你想做的事,是创建一个子集合而不是一个数组,然后数组中的每个对象都是子集合中的一个文档。

然后您可以使用集合组查询来查询子集合中的单个字段。

如果您需要访问父文档,您可以通过调用来访问它

snapshot.document.parent.parent

返回一个 DocumentReference。 (文档的父级是一个集合,所以它的 .parent.parent 来获取父级文档)。然后,您必须重新查询该引用。