Android Firestore查询获取包含搜索中值的文档的ID

时间:2018-05-10 01:03:25

标签: android firebase kotlin google-cloud-firestore

Firestore database image

您好,我刚刚尝试使用Firestore。获取文档ID时遇到了一些问题。

问题是,我想得到一个文件ID(红色框),里面有值(蓝框)。

我使用以下查询:

collection("mychannel").whereEqualTo("74wRU4xHrcV9oWAXEkKeRNp41c53")

但没有给出结果。

谢谢!

2 个答案:

答案 0 :(得分:2)

official documentation

一样
  

虽然Cloud Firestore可以存储数组, it does not support 查询数组成员或更新单个数组元素。

因此,无法可以使用以下查询:

collection("mychannel").whereEqualTo("74wRU4xHrcV9oWAXEkKeRNp41c53")

如果您只想获取整个userId数组,则需要迭代Map,如下所示:

collection("mychannel").document("1fReXb8pgQvJzFdzpkSy").get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
        if (task.isSuccessful()) {
            DocumentSnapshot document = task.getResult();
            if (document.exists()) {
                Map<String, Object> map = document.getData();
                for (Map.Entry<String, Object> entry : map.entrySet()) {
                    if (entry.getKey().equals("userId")) {
                        Log.d("TAG", entry.getValue().toString());
                    }
                }
            }
        }
    }
});

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

所以输出将是:

[74wRU4xHrcV9oWAXEkKeRNp41c53]

如果您考虑使用这种替代数据库结构,其中每个用户ID都是映射中的键并且所有值都为真,那么更好的方法是:

userId: {
    "74wRU4xHrcV9oWAXEkKeRNp41c53": true,
    "AdwF...": true,
    "YsHs...": true
}

答案 1 :(得分:1)

这个问题在这里得到解答:Firestore: Query by item in array of document

总之,不要使用数组在Firestore中存储数据,因为您尝试执行的查询尚不可用(请记住它仍处于测试阶段)。你应该使用Map。