【问题标题】:OrderBy query - Can I order by the grandchild "Vote" stored in firebase?OrderBy 查询 - 我可以通过存储在 firebase 中的孙子“投票”来订购吗?
【发布时间】:2021-07-14 02:38:50
【问题描述】:

我一直在尝试找到一种方法来通过子节点“投票”进行查询,以按“投票”数对数据进行排序。我很确定,因为我将数据存储在 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();
        }
    });

【问题讨论】:

  • 嗨! “没有正确定义路径,但有办法实现这一点”。你试过了吗?

标签: java firebase firebase-realtime-database


【解决方案1】:

这在一定程度上取决于您在 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 的另一个示例/更多信息。

【讨论】:

  • OP 使用的是 Firebase 实时数据库,而不是 Cloud Firestore。
  • 糟糕,很棒的收获。稍后会更新答案(除非你想回答,否则我会删除)。
【解决方案2】:

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
 }

另见:

【讨论】:

    【解决方案3】:

    您知道“生物和生态”等属性的所有可能值吗? 那么你可以只使用一个 for 循环并选择 ....gerReference("CountLikes").orderbychild(property[i]+"/votes").....

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-11
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多