【问题标题】:How to query users collection using array of IDs from group collection如何使用组集合中的 ID 数组查询用户集合
【发布时间】:2019-05-26 01:25:10
【问题描述】:

我有一个存储用户组的集合。每个组都有一个组名、组限制和一组用户 ID。

我想知道如何最好地检索一组详细信息,然后是用户详细信息,如姓名、照片等。

现在,我正在对数据库进行两次查询。首先检索组数据(名称等),其次获取用户列表中包含组 ID 信息的用户详细信息:

“syncDesp = a4sQ27xb1wuD2rhONU2K”

我怕多次调用数据库。

// Get Group details
Preferencias prefs = new Preferencias(view.getContext());
listenGroups = pFirestore.collection("syncDesps").document(prefs.getSyncDesp()).addSnapshotListener((documentSnapshot, e) -> {
    if(e != null){
        Log.i("dados erro", Objects.requireNonNull(e).getMessage());
    }
    if(documentSnapshot != null){
        String nomeGrupo = Objects.requireNonNull(documentSnapshot.get("nomeGrupo")).toString();
        textNomeGrupo.setText(nomeGrupo);
        ArrayList membrosGrupo = (ArrayList) Objects.requireNonNull(documentSnapshot.get("syncDesp"));

    }
});

// Get User Details
FirebaseFirestore grupoFire = FirebaseFirestore.getInstance();
grupoFire.collection("usuarios")
        .whereEqualTo("syncDesp", prefs.getSyncDesp())
        .addSnapshotListener((queryDocumentSnapshots, e1) -> {
            listaUsuarios.clear();
            if(e != null){
                Log.i("dados erro", Objects.requireNonNull(e1).getMessage());
            }
            for(DocumentSnapshot usuarioSnapshot : Objects.requireNonNull(queryDocumentSnapshots).getDocuments()){
                String idU = (usuarioSnapshot.get("id") == null) ? "" : Objects.requireNonNull(usuarioSnapshot.get("id")).toString();
                String nomeUsuario = (usuarioSnapshot.get("nome") == null) ? "" : Objects.requireNonNull(usuarioSnapshot.get("nome")).toString();
                String fotoUsuario = (usuarioSnapshot.get("imgUsuario") == null) ? "" : Objects.requireNonNull(usuarioSnapshot.get("imgUsuario")).toString();

                UsuarioMeuGrupo usuarioMeuGrupo = new UsuarioMeuGrupo();//
                usuarioMeuGrupo.setIdUsuario(idU);
                usuarioMeuGrupo.setNome(nomeUsuario);
                usuarioMeuGrupo.setFoto(fotoUsuario);
                listaUsuarios.add(usuarioMeuGrupo);
            }

            adaptera.setOnItemClickRemoverListener(uMeuGrupo -> {
                Log.i("dados uMeuGrupo Clic", uMeuGrupo.getNome());
            });
            adaptera.notifyDataSetChanged();
        });

我想知道是否应该将组集合与用户集合分开查询,或者是否有一种方法可以只创建一个函数来从两个集合中检索数据。

【问题讨论】:

    标签: android google-cloud-firestore


    【解决方案1】:

    无法在 Cloud Firestore 中跨多个集合进行单个查询。没有像 SQL 中那样的类似连接的操作。唯一的例外是collection group queries,它不适用于您的情况。

    您现在所做的可能是您对现有数据库结构所能做的最好的事情。如果您想要更少的查询,您将不得不做一些事情来重组您的数据以支持它。

    【讨论】:

    • 谢谢@Doug 已经帮了很多忙。谈到数据库结构,您对如何更改它有什么建议吗?用户的组是在组中包含的用户之间共享数据。但也需要一些屏幕来查看、编辑组名和用户。
    • 由于您一次只能查询一个集合,因此您必须以满足您想要的最终结果的方式将所有信息放入其文档中。
    猜你喜欢
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 2020-02-04
    • 2022-01-09
    • 2019-10-04
    • 2023-03-18
    相关资源
    最近更新 更多