Firebase 数据库 Rest Api:如何使用未知节点订购

Posted

技术标签:

【中文标题】Firebase 数据库 Rest Api:如何使用未知节点订购【英文标题】:Firebase Database Rest Api : How to OrderBy with Unknown nodes 【发布时间】:2022-01-03 05:18:37 【问题描述】:

我正在使用 Firebase Database Rest Api,并且我有一个显示新闻的应用程序,我想要一种通过使用每个帖子的(视图)计数降序来排序这些新闻的方法,在同时, 因此,我正在寻找一种方法来按(服务器端)最高观看次数对所有新闻进行排序。

我的数据结构是这样的: 主要/新闻/类别/教育/PostId/

我的 json :


  "Main" : 
    "News" : 
      "Categories" : 
        "Education" : 
          "-Mn7-ZxkUPO01ifhtpEn" : 
            "Text" : "some text",
            "Title" : "some title",
            "Views" : 5
          ,
          "-Mn7-ZxkUPO01ifhtp11En" : 
            "Text" : "some text",
            "Title" : "some title",
            "Views" : 5
          ,
          "-Mn7-ZxkUPO0112ifhtpEn" : 
            "Text" : "some text",
            "Title" : "some title",
            "Views" : 12
          ,
          "-Mn7-ZxkUPO01dxifhtpEn" : 
            "Text" : "some text",
            "Title" : "some title",
            "Views" : 545
          ,
          "-Mn7-ZxkUPO01sdifhtpEn" : 
            "Text" : "some text",
            "Title" : "some title",
            "Views" : 5
          ,
          "-Mn7-ZxkUPO01ifddhtpEn" : 
            "Text" : "some text",
            "Title" : "some title",
            "Views" : 200
          ,
          "-Mn7-ZxkUPO01ifdshtpEn" : 
            "Text" : "some text",
            "Title" : "some title",
            "Views" : 1
          ,
          "-Mn7-ZxkUPO01ifhtdxpEn" : 
            "Text" : "some text",
            "Title" : "some title",
            "Views" : 223
          ,
          "-Mn7-ZxkUPO01ifhewtpEn" : 
            "Text" : "some text",
            "Title" : "some title",
            "Views" : 451
          ,
          "-Mn7-ZxkUPO01idsdfhtpEn" : 
            "Text" : "some text",
            "Title" : "some title",
            "Views" : 532
          ,
          "-Mn7-ZxkUPO01ifh2tpEn" : 
            "Text" : "some text",
            "Title" : "some title",
            "Views" : 1500
          ,
          "-Mn7-ZxkUPOd01ifh2tpEn" : 
            "Text" : "some text",
            "Title" : "some title",
            "Views" : 45
          ,
          "-Mn7-ZxkUPO01ifh21tpEn" : 
            "Text" : "some text",
            "Title" : "some title",
            "Views" : 2
          ,
          "-Mn7-ZxkUPO01ifh2dstpEn" : 
            "Text" : "some text",
            "Title" : "some title",
            "Views" : 4
          ,
          "-Mn7-ZxkUPO01ifh2txpEn" : 
            "Text" : "some text",
            "Title" : "some title",
            "Views" : 4
          ,
          "-Mn7-ZxkUPO01ifhds2tpEn" : 
            "Text" : "some text",
            "Title" : "some title",
            "Views" : 2
          ,
          "-Mn7-ZxkUPO01iddfh2tpEn" : 
            "Text" : "some text",
            "Title" : "some title",
            "Views" : 33
          ,
          "-Mn7-ZxkUPO01idxfh2tpEn" : 
            "Text" : "some text",
            "Title" : "some title",
            "Views" : 52
          ,
          "-Mn7-ZxkUPO01idsdfh2tpEn" : 
            "Text" : "some text",
            "Title" : "some title",
            "Views" : 1
          ,
          "-Mn7-ZxkUPO01ifh2tpEdsn" : 
            "Text" : "some text",
            "Title" : "some title",
            "Views" : 1000000
          
        
      
    
  

有没有办法解决这个过程 最好的问候:)

【问题讨论】:

您应该可以OrderByChild("Views").LimitToLast(10) 获得浏览次数最多的 10 个节点。如果这不起作用:您在问题中包含了 JSON 树的图片。请将其替换为实际的 JSON 作为文本,您可以通过单击 your Firebase Database console 的溢出菜单 (⠇) 中的 Export JSON 链接轻松获得。将 JSON 作为文本使其可搜索,让我们可以轻松地使用它来测试您的实际数据并在我们的答案中使用它,一般来说这只是一件好事。 谢谢你帮助我 :),你是一个伟大的人,我很抱歉图像,我用 JSON 文本替换它你现在可以复制 JSON,请我必须澄清一下没有方法称为(OrderByChild),因为我使用c#但是有OrderBy(“”)方法,当我使用它并放置(“Views”)时会出现错误:索引未定义,添加“.indexOn”我的新闻路径 据我所知,Unity/Xamarin C# SDK 有 OrderByChild,但如果你的是 REST API 的不同包装器,那么 OrderBy("Views") 将是等效的。错误消息应准确说明您需要在何处添加索引。 【参考方案1】:

为了能够通过 REST API 按子属性查询/排序,您需要在数据库规则中对该属性进行define an index。


  "rules": 
    ...
    "Main": 
      "News": 
        "Categories": 
          "Education": 
            ".indexOn": "views"
          
        
      
    
  

如果此处的这些节点名称中的任何一个在您的规则中是可变的,您也可以在此处use a wildcard capture variable。

【讨论】:

我根据数据更改了 Firebase 数据库规则并使用 OrderBy("Views") 并没有错误,但它只返回前 10 个而不是前 10 个视图 抱歉拖了这么久是的,这些帖子是通过push id添加的,我的意思是它们不是固定路径,所以你认为我应该使用(使用通配符捕获)这个 正如我在对您问题的最初评论中所说,您需要执行 LimitToLast(10)(或您的库中的等效项)才能获得 10 个最高分。您可能还需要在客户端恢复 10 个结果,因为 REST 结果将被正确过滤,但不会被排序(因为 JSON 没有定义对象中键的顺序)。 我试了一下,现在它对我有用 :) 谢谢你,感谢你对我的帮助,问题是我使用 (LimitToFirst) 而不是 (LimitToLast) 因为我希望它能让我第一个最高结果再次感谢您,因为这个过程花了我 4 天的时间来研究它 请有一个问题,当我在开始时获取 10 个数据时,它将按视图正确排序,但是当我使用 **StartAt(LastId) ** 和 LimitToLast(10) 获取另外 10 个数据时firebase 数据库返回 0,这是我的 c# 代码: public string latestid; var data = await firebaseclient .Child("Education") .OrderBy("Views") .StartAt(latestid) .LimitToLast(10) .OnceAsync();

以上是关于Firebase 数据库 Rest Api:如何使用未知节点订购的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 HTTP REST API 访问我的 Firebase 数据库?

如何将firebase REST API响应转换为打字稿中的数组?

Firebase 数据库 Rest Api:如何使用未知节点订购

Firebase Rest Api:如何使用 OrderBy() 和 StartAt() 使用 Last Key id

Firebase实时数据库REST API是否支持不同实体位置的多路径更新?

如何从 Firebase 函数调用第三方 Rest API 以用于 Google 上的操作