代码之家  ›  专栏  ›  技术社区  ›  Fathur Radhy

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

  •  1
  • Fathur Radhy  · 技术社区  · 6 年前

    Firestore database image

    你好,我刚试着用Firestore。我在获取文档id时遇到一些问题。

    问题是,我想获取一个文档id(红色框),其中包含值(蓝色框)。

    我使用以下查询:

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

    但没有给出结果。

    谢谢

    2 回复  |  直到 6 年前
        1
  •  3
  •   Alex Mamo    6 年前

    如中所示 official documentation :

    虽然云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());
                        }
                    }
                }
            }
        }
    });
    

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

    因此,输出将为:

    [74wRU4xHrcV9oWAXEkKeRNp41c53]
    

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

    userId: {
        "74wRU4xHrcV9oWAXEkKeRNp41c53": true,
        "AdwF...": true,
        "YsHs...": true
    }
    
        2
  •  1
  •   DAA    6 年前

    这里回答了这个问题: Firestore: Query by item in array of document

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