【问题标题】:Ordering queries by deep paths with a variable key使用变量键通过深度路径对查询进行排序
【发布时间】:2017-02-06 23:49:02
【问题描述】:

这是我在数据库中的数据结构

"2017" : {
    "metadata" : {
      "February" : {
        "-Kc3BF0V1iLgtnI65LuR" : {
          "date" : "2017-02-04T13:36:38.311Z",
          "price" : 80
        },
        "-Kc3BF0V1xxfrtnI65OlS" : {
          "date" : "2017-02-11T13:36:38.311Z",
          "price" : 70
        },
        "-Kc3BF0V1xxfrtnIOZozp" : {
          "date" : "2017-02-03T13:36:38.311Z",
          "price" : 90
        }
      },
      "January" : {
        "-Kc3E5bpxpo3RpSHH3fn" : {
          "date" : "2017-01-01T13:50:12.264Z",
          "price" : 45
        },
        ...
      }
    }
  }

我在我的 ionic 应用程序的列表中显示这些数据,就像这样

February
 + 2017-02-04
 + 2017-02-11
 + 2017-02-03
January
 + 2017-01-01

现在我想对月份下的数据进行排序,所以二月份下的数据会变成

February
 + 2017-02-03
 + 2017-02-04
 + 2017-02-11

read in the firebase blog 已经添加了一项功能,您可以通过深度路径对查询进行排序 但是当你有一个动态键时,我找不到如何查询它,在我的例子中,月份是动态键。因为每个月的孩子都需要按日期排序。

我正在使用这个 sn-p 从 firebase 检索数据

 var dbRef = firebase.database().ref(year +  '/metadata/').orderByChild('date'); //How to order by date if my month is variable?
 return firebaseObject(dbRef); 

我还尝试使用 orderBy 过滤器按角度排序,但这不起作用,因为它需要是一个数组。我找到了blog,他们将其转换为数组,但您将丢失密钥,我仍然需要它,因为该列表是可点击的,因此我可以前往它的详细信息页面。另外我不认为在前端进行排序是一个好主意。

【问题讨论】:

    标签: angularjs sorting firebase firebase-realtime-database


    【解决方案1】:

    Firebase 数据库查询只能包含一个动态路径:您查询的位置正下方的子路径。虽然orderByChild() 可以获取用于对数据进行排序的属性的路径,但该路径必须是静态的。

    这意味着,如果您想按日期查询所有月份的元数据,您应该保留所有月份的元数据列表:

    "metadataList" : {
        "-Kc3BF0V1iLgtnI65LuR" : {
          "date" : "2017-02-04T13:36:38.311Z",
          "price" : 80
        },
        "-Kc3BF0V1xxfrtnI65OlS" : {
          "date" : "2017-02-11T13:36:38.311Z",
          "price" : 70
        },
        "-Kc3BF0V1xxfrtnIOZozp" : {
          "date" : "2017-02-03T13:36:38.311Z",
          "price" : 90
        }
        "-Kc3E5bpxpo3RpSHH3fn" : {
          "date" : "2017-01-01T13:50:12.264Z",
          "price" : 45
        },
        ...
    }
    

    【讨论】:

    • 但是使用这个数据结构,我将无法像上面显示的那样在月/日视图中显示我的列表。没有其他方法吗?或者我怎样才能达到我想要的静止状态?
    • 正确。因此,如果您想要该用例,您应该按月保存数据列表。在 NoSQL 数据库中,您通常会复制数据以允许您的应用程序需要的用例。我建议阅读NoSQL data modeling 并观看Firebase for SQL developers
    猜你喜欢
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    相关资源
    最近更新 更多