首页 文章

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

提问于
浏览
0

我在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 回答

  • 1

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

    值必须是数组

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

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

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

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

    然后查询该数组:

    someRef.whereArrayContains("userIds", someId);
    
  • 0

    根据文档,字段指向数组和值意味着您要检查的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);
    

相关问题