[英]How to query documents containing array of objects in Firestore collection using whereArrayContains() filter on Android?
我在 firestore 中有一个集合,其中每个文档都包含一个联系人数组,我想查询那些任何联系人的 email id 都是特定值的文档。
我在https://firebase.google.com/docs/reference/android/com/google/firebase/firestore/Query#whereArrayContains(java.lang.String,%20java.lang.Object)遇到了 whereArrayContains() 过滤器,具有以下描述:-
public Query whereArrayContains(字符串字段,Object值)
创建并返回一个带有附加过滤器的新查询,文档必须包含指定的字段,该值必须是一个数组,并且该数组必须包含提供的值。一个查询只能有一个 whereArrayContains() 过滤器。
上述方法中的value
是否可以指向对象数组的 object 中的字段?
此外,鉴于方法参数也称为value
,短语the value must be an array
有点令人困惑。 我确信文档意味着该field
应该出现在文档中并且它的值应该是一个数组并且该数组应该包含value
参数。
您无法在 Firestore 查询中查询数组中的对象字段。 array-contains 查询将与数组中的对象进行比较。
该值必须是一个数组
这是指您尝试查询的字段的值。 更好的措辞是
创建并返回一个新的查询与所述额外的过滤器的文档必须包含指定字段中,指定字段的值必须是一个阵列,并且该阵列必须包含所提供的值。
如果您尝试过滤用户 ID 或类似内容,请考虑向您查询的对象添加第二个数组,然后将 ID 作为字符串添加到该数组中:
{
"name": "test",
"users": [someUserObject, someOtherUserObject],
"userIds": ["someId", "someOtherId"]
}
然后查询该数组:
someRef.whereArrayContains("userIds", someId);
根据文档,该字段指向数组,值表示您要检查的字符串是否存在于数组中。
您可以使用 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);
正如其他人所说,不可能按照你的要求去做。
“Firebase-y”方式做你想做的,是创建一个子集合而不是一个数组,然后数组中的每个对象都是子集合中的一个文档。
然后,您可以使用集合组查询来查询子集合中的各个字段。
如果您需要访问父文档,您可以通过调用访问它
snapshot.document.parent.parent
它返回一个 DocumentReference。 (文档的父级是一个集合,所以它的 .parent.parent 来获取父级文档)。 然后,您必须重新查询该参考。
您可以使用 map 而不是像接受的答案那样使用两个 arrays,而是像这样构造您的数据:
{
users: {
userId1: {
name: "...",
//rest of the fields
},
userId2: {
name: "...",
//rest of the fields
}
}
//rest of the fields
}
然后使用此查询按 id 进行过滤
collectionRef.orderBy("users.userId1")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.