如何从Firestore获取对象数组

9

如何正确地查询一个由映射组成的数组字段。

目前的结构是

Collection1
     Document1
         -papers:                <---- This is an array  
              (0): 
                 -Name:abc
                 -Id:123 
              (1): 
                 -Name:xyz
                 -Id:456

这是我的代码

DocumentReference docRef = db.collection("Collection1").document("Document1");
        docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                if (task.isSuccessful()) {
                    DocumentSnapshot document = task.getResult();
                    if (document != null && document.exists()) {
                       //?? how can I retrieve papers
                }
            }
        });

基本上,我会将其检索并转换为ArrayList>,然后循环遍历以创建最终的ArrayList吗?
还是它是如何工作的?

除了我的回答之外,我认为这个资源也会对未来的访问者有所帮助。 - Alex Mamo
2个回答

8
根据更新的关于数组成员资格的文档,现在可以使用whereArrayContains()方法基于数组值来过滤数据。一个简单的例子如下:
CollectionReference citiesRef = db.collection("cities");
citiesRef.whereArrayContains("regions", "west_coast");

这个查询返回所有城市文档,其中regions字段是一个包含west_coast的数组。如果数组中有多个与你查询的值相同的实例,那么该文档只会在结果中包含一次。
根据关于数组的官方文档
尽管 Cloud Firestore 可以存储数组,但它不支持查询数组成员或更新单个数组元素。
如果您只想获取整个papers数组,您需要按照以下方式迭代一个Map
Map<String, Object> map = document.getData();
for (Map.Entry<String, Object> entry : map.entrySet()) {
    if (entry.getKey().equals("papers")) {
        Log.d("TAG", entry.getValue().toString());
    }
}

但要注意,即使将 papers 对象存储在数据库中作为一个数组,entry.getValue() 返回的是一个ArrayList,而不是一个array

你不能查询数组成员,这意味着你不能基于成员进行过滤,但是你当然可以获取所有的数组成员数据。否则为什么要存储它们呢?在我发布问题后,我能够获得一个哈希映射数组,然后迭代它以创建我的模型数组。虽然我希望有更简单的方法。 - Snake
抱歉如果让你感到困惑了。是的,Cloud Firestore 中的每个文档都是一个 Map,因此您需要迭代才能获取数组。如果您使用了模型类,可以在模型类对象上调用 getArray() 方法。请参见我的更新答案。 - Alex Mamo

0

ArrayList<Map<String, Object>> arrayInTheDocument = (ArrayList<Map<String, Object>> ) documentSnapshot.getData().get("documentName.ArrayName");

ArrayList<Map<String, Object>> arrayInTheDocument = (ArrayList<Map<String, Object>>) documentSnapshot.getData().get("documentName.ArrayName");


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接