我在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
参数。
答案 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 来获取父级文档)。然后,您必须重新查询该引用。