Java OrderBy查询-我可以按孙子下单吗;投票“;存储在firebase中?

Java OrderBy查询-我可以按孙子下单吗;投票“;存储在firebase中?,java,firebase,firebase-realtime-database,Java,Firebase,Firebase Realtime Database,我一直在试图找到一种方法,通过子节点“投票”来查询,以便按“投票”的数量对数据进行排序。我很确定,因为我在firebase中存储数据的方式,无法查询数据,但我目前必须以这种方式存储数据 { "45" : { "Biological and Ecological" : { "Votes" : 1 } }, "567" : { "Technology" : { "Votes" : 2

我一直在试图找到一种方法,通过子节点“投票”来查询,以便按“投票”的数量对数据进行排序。我很确定,因为我在firebase中存储数据的方式,无法查询数据,但我目前必须以这种方式存储数据

  {
     "45" : {
       "Biological and Ecological" : {
         "Votes" : 1
        }
    },
     "567" : {
       "Technology" : {
         "Votes" : 2
        }
    },
     "620" : {
       "Technology" : {
          "Votes" : 1
        }
  },
     "702" : {
       "Social and Behavioral" : {
          "Votes" : 1
        }

     }
 }
我正试图按孩子的顺序“投票”,有没有办法做到这一点?下面是当前显示路径的方法。我知道。OrderbyChild(“投票”)没有正确定义路径,但有办法实现吗

   Query query = FirebaseDatabase.getInstance().getReference("CountLikes/").orderByChild("Votes");

   query.addListenerForSingleValueEvent(new ValueEventListener() {

    @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            for(DataSnapshot child: dataSnapshot.getChildren()) {

                for(DataSnapshot grandchild: child.getChildren()) {
                    arrayList.add("Project " + child.getKey() + "         " + grandchild.getKey() + "        " + (String.valueOf(grandchild.child("Votes").getValue(Long.class)))); 

                    adapter.notifyDataSetChanged();


                }

                }}



        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            throw databaseError.toException();
        }
    });

这在一定程度上取决于数据模型在RealtimeDatabase中的实际设置方式。在这种情况下,您试图排序的数据没有一致的路径(似乎是不同的投票类型)

如果您有以下情况:

CountLikes: [ // collection
    docId: { // document
        typeOfVote: { // map name
            "votes": number // vote count
        }
    }
]
如果“投票”与“typeOfVote”分开,则您尝试按孩子排序的方式是可能的,因为现在您无法通过潜在的通配符按孩子排序(例如,为了获得比“技术”更深的级别)

这样,您的orderByChild“投票”可能会起作用:)

(更新)
显示orderByChild的另一个示例/更多信息。

Firebase实时数据库可以基于属性查询位置的子节点,只要该属性位于具有固定路径的已知位置

在您的情况下,子节点不在固定路径上(因为
技术
生物和生态
键不固定),因此当前数据结构无法进行此查询

要允许查询,请重新构造数据以将其转换为平面列表。例如,这可能会起作用:

 "45" : {
   "Category": "Biological and Ecological",
   "Votes" : 1
 }
 "567" : {
   "Category": "Technology",
   "Votes" : 2
 },
 "620" : {
   "Category": "Technology",
    "Votes" : 1
 },
 "702" : {
   "Category": "Social and Behavioral",
   "Votes" : 1
 }
另见:


嗨!“没有正确定义路径,但有没有办法做到这一点”。你试过了吗?OP使用的是Firebase实时数据库,而不是云Firestore。哇,太棒了。将在一点时间内更新答案(除非您愿意回答,否则我将删除)。
FirebaseDatabase.getInstance().getReference("CountLikes/").orderByChild("votes")
 "45" : {
   "Category": "Biological and Ecological",
   "Votes" : 1
 }
 "567" : {
   "Category": "Technology",
   "Votes" : 2
 },
 "620" : {
   "Category": "Technology",
    "Votes" : 1
 },
 "702" : {
   "Category": "Social and Behavioral",
   "Votes" : 1
 }