且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Firestore:查询android中数组中的所有元素

更新时间:2023-02-05 15:37:30

官方文档


虽然Cloud Firestore可以存储数组, 但它不支持 查询数组成员或更新单个数组元素。

Although Cloud Firestore can store arrays, it does not support querying array members or updating single array elements.

如果您只想获得整个论文数组,则需要迭代地图,如下所示:

If you only want to get the entire papers array you need to iterate over a Map like this:

Map<String, Object> map = documentSnapshot.getData();
for (Map.Entry<String, Object> entry : map.entrySet()) {
    if (entry.getKey().equals("Phonenumbers")) {
        Log.d("TAG", entry.getValue().toString());
    }
}

但请注意,即使 Phonenumbers 对象作为数组存储在数据库中, entry.getValue()返回 ArrayList ,而不是数组

But note, even if Phonenumbers object is stored in the database as an array, entry.getValue() returns an ArrayList, not an array.

只有在使用多个查询数据库时才需要使用索引属性。但不是你的情况。

You need to use indexes only when you query your database using more then one property. But is not your case.

如果你考虑这种替代数据库结构,其中每个电话号码是地图中的关键并且所有值都为真,那么更好的方法是:

A better approach will be if you consider this alternative database structure, where each phone number is the key in a map and all values are true:

Phonenumbers: {
    "987654321": true,
    "123456789": true,
    "234567890": true
}

编辑2018年8月13日:

根据有关数组成员资格,现在可以使用 whereArrayContains()方法根据数组值过滤数据。一个简单的例子是:

According to the updated documentation regarding array membership, now it is possible to filter data based on array values using whereArrayContains() method. A simple example would be:

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




此查询返回每个城市文档,其中regions字段是一个数组包含west_coast。如果数组具有您查询的值的多个实例,则文档仅包含在结果中一次。

This query returns every city document where the regions field is an array that contains west_coast. If the array has multiple instances of the value you query on, the document is included in the results only once.