OrderBy查询-我可以通过Firebase中存储的孙子“ Vote”进行订购吗?

时间:2019-02-05 10:38:53

标签: java firebase firebase-realtime-database

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

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

     }
 }

我正在尝试按孩子的“投票”命令进行订购吗?下面是当前显示方法,我知道.OrderbyChild(“ Votes”)不能正确定义路径,但是有办法实现吗?

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

3 个答案:

答案 0 :(得分:0)

这取决于您如何在RealtimeDatabase中实际设置数据模型。在这种情况下,您尝试排序的数据没有统一的路径(看起来是不同的投票类型)。

如果您有类似的东西:

CountLikes: [ // collection
    docId: { // document
        typeOfVote: { // map name
            "votes": number // vote count
        }
    }
]

如果将“ votes”从“ typeOfVote”中分离出来,您将可能尝试按孩子订购的方式,因为目前您无法通过潜在的通配符(按更高的级别来获得孩子的订购) ”。

CountLikes: [
    docId: {
        "votes": number,
        "type": typeOfVote
    }
]

这样,您的orderByChild“投票”可能可能有效:)

FirebaseDatabase.getInstance().getReference("CountLikes/").orderByChild("votes")

(更新) This answer by Frank (and read the comments)显示了orderByChild的另一个示例/更多信息。

答案 1 :(得分:0)

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

在您的情况下,子节点不在固定路径上(因为TechnologyBiological and Ecological键是不固定的),因此无法使用当前数据结构进行此查询。

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

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

另请参阅:

答案 2 :(得分:0)

您是否知道该财产的所有可能价值,例如“生物和生态”? 那么你可以只是一个 for 循环并选择 ....gerReference("CountLikes").orderbychild(property[i]+"/votes").....

我知道这是一种奇怪的方式, 但正如你被告知你不能改变结构,即使我会建议你在数据库中保留另一个数据集作为属性值