Android Firestore,查询数组

Pem*_*ang 4 android google-cloud-firestore

在此处输入图片说明我想从上述数据库中查询突出显示的值

我的代码不完整,我无法确定如何完成查询。我想知道整个集合中的任何地方是否存在123,456,789,就像正常查询.whereEqualTo("address","P18/A CIT Road Ananda Palit");会给我第三个文档一样,在这里我想查询card

CollectionReference ref = db.collection("company");
Query query = ref.whereEqualTo("card[]","???");
Run Code Online (Sandbox Code Playgroud)

Ale*_*amo 5

要解决此问题,请使用以下代码:

ref.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        for (DocumentSnapshot document : task.getResult()) {
            List<String> list = (List<String>) document.get("card");
            for (String item : list) {
                    Log.d("TAG", item);
            }
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

输出将是:

123
456
789
//and so on
Run Code Online (Sandbox Code Playgroud)

请记住,document.get("card")不返回array,而是返回ArraList

如果要使用Query using whereEqualTo()方法,则建议您对数据库进行一些更改。您的数据库结构应如下所示:

Firestore-root
   |
   --- company
         |
         --- companyDocumentId
                |
                --- address: "P18/A CIT Road Palit"
                |
                --- card
                     |
                     --- 123: true
                     |
                     --- 456: true
                     |
                     --- 789: true
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您的查询应如下所示:

Query = ref.whereEqualTo("card.123", true);
Run Code Online (Sandbox Code Playgroud)

编辑:

根据您的建议,查询应为:

Query = ref.whereEqualTo("card.E20040806709002620760CE82", true);
Run Code Online (Sandbox Code Playgroud)

编辑2018年8月13日:

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

CollectionReference citiesRef = db.collection("cities");
citiesRef.whereArrayContains("regions", "west_coast");
Run Code Online (Sandbox Code Playgroud)

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