【问题标题】:How to query documents containing array of objects in Firestore collection using whereArrayContains() filter on Android?如何在 Android 上使用 whereArrayContains() 过滤器查询包含 Firestore 集合中对象数组的文档?
【发布时间】:2019-02-20 09:49:05
【问题描述】:

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

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

public Query whereArrayContains(字符串字段,对象值)
使用文档必须的附加过滤器创建并返回一个新查询 包含指定的字段,值必须是一个数组,并且 数组必须包含提供的值。

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

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

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

【问题讨论】:

  • an object for an array of objects 是什么意思?还请发布您的数据库结构。
  • 在每个文档中我都有一组联系人。文档的一个示例是 {groupName:'group1', contacts: [{name: 'Abc', email:'abc@abc.com'}, {name:'Def', email:'def@abc.com '}]}。现在我的目标是获取联系人数组包含电子邮件“abc@abc.com”的所有组。是否可以使用数组包含运算符来做到这一点?
  • 它可能有效,但请添加您的数据库结构的屏幕截图以更清楚地查看它。

标签: android firebase google-cloud-firestore


【解决方案1】:

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

您可以使用 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】:

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

    值必须是数组

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

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

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

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

    然后改为查询该数组:

    someRef.whereArrayContains("userIds", someId);
    

    【讨论】:

    【解决方案3】:

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

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

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

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

    snapshot.document.parent.parent
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-21
      • 2021-06-10
      • 1970-01-01
      • 1970-01-01
      • 2018-12-09
      • 2019-01-27
      • 1970-01-01
      相关资源
      最近更新 更多