OrderByChild在结果中再添加一个元素

时间:2018-12-22 18:41:26

标签: android firebase firebase-realtime-database

我试图获取某个用户所拥有的事件,但事实是,在执行orderByChild()之后,它又过滤了一个我不想要的事件。

代码

//I find the user that belongs to a certain Tutor
        mDatabase.child("tutorjugadores").child(mAuth.getCurrentUser().getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshotJugador) {
                for(final DataSnapshot snapshotJugadoresTutor : dataSnapshotJugador.getChildren()){
                    if(dataSnapshotJugador.exists()){

                        //If the user has not assisted to a certain event, I get the user that belongs to the user and get the event ID
                        mDatabase.child("asistenciasjugadores").orderByChild(snapshotJugadoresTutor.getKey()).addListenerForSingleValueEvent(new ValueEventListener() {
                            @Override
                            public void onDataChange(@NonNull DataSnapshot dataSnapshotEvento) {
                                for(DataSnapshot snapshotEventos : dataSnapshotEvento.getChildren()){
                                    //Getting the event key from that user

                                    String eventKey = snapshotEventos.getKey();
                                    Log.d(TAG, "Event : "+eventKey + "  of the user "+snapshotJugadoresTutor.getKey());
                                }


                            }

                            @Override
                            public void onCancelled(@NonNull DatabaseError databaseError) {

                            }
                        });

                    }
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

现在,这是我的数据库结构

enter image description here

问题

现在,当我运行此代码并执行日志以获取用户2UHHZWR6B8P9XJPuLYrAg6aEgN63的事件时,我又收到了另一个不属于该用户的事件,该事件就是这个{{1 }}

我的日志

  

事件:-用户的LU930PpCaQXT8CvUbc8 2UHHZWR6B8P9XJPuLYrAg6aEgN63

     

事件:-用户的LTRz61EcBUx-RLSSEaU 2UHHZWR6B8P9XJPuLYrAg6aEgN63

     

事件:-用户的LTSGFGdW1nQbtd9HOBh 2UHHZWR6B8P9XJPuLYrAg6aEgN63

     

事件:-用户的LTSIG_lqckgHEZ1q9YS 2UHHZWR6B8P9XJPuLYrAg6aEgN63

如您所见,正在列出该用户的所有事件,但该用户只有3个与之关联的事件。

当我订购这条线时

-LU930PpCaQXT8CvUbc8

我希望只获取具有用户ID .orderByChild(snapshotJugadoresTutor.getKey()) 的节点,然后循环并从该用户获取每个事件ID,但是相反,我也从该用户获取事件ID {{1 }}。

1 个答案:

答案 0 :(得分:1)

仅通过使用基于JSON的数据库(例如Firebase)无法过滤字符串。 而 orderByChild 仅更改返回值的排序。因此,您基本上是在对该键下的所有值进行排序,因此不会进行任何过滤。 在这之后,您有3个选择。

选项1-效率不高,仅建议用于小型应用程序: 您可以对所有值进行排序,然后再进行过滤。

选项2-推荐: 您可以更改数据结构。创建另一个节点,例如“ UserEvents”。在其下存储UID。在该UID下,应该只有该用户的事件。

选项3-推荐并起作用: 您可以使用Elasticsearch。非常适合复杂的查询。切换到“按需购买”计划后,可以将其与带有Google Cloud Functions的Firebase一起使用,也可以使用Flashlight扩展将另一台服务器与Firebase数据库集成。