Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按子级排序时使用startAt()分页_Javascript_Firebase_Pagination_Firebase Realtime Database - Fatal编程技术网

Javascript 按子级排序时使用startAt()分页

Javascript 按子级排序时使用startAt()分页,javascript,firebase,pagination,firebase-realtime-database,Javascript,Firebase,Pagination,Firebase Realtime Database,我试图检索一个记录列表,按每个记录中的一个字段排序,我希望能够检索页面中的数据 根据,reference.startAt()方法有一个可选的第二个参数,即: 要开始的子键。只有按子级、值或优先级排序时,才允许使用此参数。 首先,以下是数据: { "products" : { "-KlsqFgVWwUrA-j0VsZS" : { "name" : "Product 4", "price" : 666 }, "-Klst-cLSckuwAuNAJF

我试图检索一个记录列表,按每个记录中的一个字段排序,我希望能够检索页面中的数据

根据,reference.startAt()方法有一个可选的第二个参数,即:

要开始的子键。只有按子级、值或优先级排序时,才允许使用此参数。

首先,以下是数据:

{
  "products" : {
    "-KlsqFgVWwUrA-j0VsZS" : {
      "name" : "Product 4",
      "price" : 666
    },
    "-Klst-cLSckuwAuNAJF8" : {
      "name" : "Product 1",
      "price" : 100
    },
    "-Klst7IINdt8YeMmauRz" : {
      "name" : "Product 2",
      "price" : 50
    },
    "-Klst9KfM2QWp8kXrOlR" : {
      "name" : "Product 6",
      "price" : 30
    },
    "-KlstB51ap1L2tcK8cL6" : {
      "name" : "Product 5",
      "price" : 99
    },
    "-KlstDR5cCayGH0XKtZ0" : {
      "name" : "Product 3",
      "price" : 500
    }
  }
}
这是能够检索第1页的代码(最低价商品+第二低价商品+第三低价商品):

(我正在使用Firebase JS SDK 4.1.1)

输出:

TJ:database tjwoon$ node test.js
-Klst9KfM2QWp8kXrOlR: {"name":"Product 6","price":30}
-Klst7IINdt8YeMmauRz: {"name":"Product 2","price":50}
-KlstB51ap1L2tcK8cL6: {"name":"Product 5","price":99}
TJ:数据库tjwoon$node test.js

-Klst9KfM2QWp8kXrOlR: {"name":"Product 6","price":30}
-Klst7IINdt8YeMmauRz: {"name":"Product 2","price":50}
-KlstB51ap1L2tcK8cL6: {"name":"Product 5","price":99}
第2页应该是第三低、第四低和第五低价格的产品,这意味着我的代码还需要一行:

firebase.database().ref('products')
.orderByChild('price')
.startAt(null, '-KlstB51ap1L2tcK8cL6')
.limitToFirst(3)
.on('child_added', function (snapshot) {
    var key = snapshot.key;
    var data = snapshot.val();
    console.log(key + ': ' + JSON.stringify(data))
})
输出:

TJ:database tjwoon$ node test.js
-Klst9KfM2QWp8kXrOlR: {"name":"Product 6","price":30}
-Klst7IINdt8YeMmauRz: {"name":"Product 2","price":50}
-KlstB51ap1L2tcK8cL6: {"name":"Product 5","price":99}
问题是它再次返回第1页。如果文档正确,结果应从记录处开始,键为
-KlstB51ap1L2tcK8cL6

我尝试为price字段添加
.indexOn
规则,但结果仍然相同

如果我删除了
orderByChild()
行,那么结果确实从给定的键开始,但排序当然不正确,而且它的行为与文档相反

我发现了其他描述相同问题的堆栈溢出帖子:

  • (见下面的评论。我没有足够的声誉在这里添加链接)
然而,这些问题没有答案,回答也很少。Github存储库中没有与搜索词
startat
匹配的问题

还有其他人面临同样的问题吗?这个问题使得无法以分页方式检索已排序的列表…

您就快到了

问题在于如何调用第二页的
startAt

.startAt(null, '-KlstB51ap1L2tcK8cL6')
要获得正确的结果,您需要输入所谓锚定项的价格和密钥:

.startAt(99, '-KlstB51ap1L2tcK8cL6')
Firebase将找到所有价格为
的物品,然后返回从
键开始的物品-KlstB51ap1L2tcK8cL6'

你就快到了

问题在于如何调用第二页的
startAt

.startAt(null, '-KlstB51ap1L2tcK8cL6')
要获得正确的结果,您需要输入所谓锚定项的价格和密钥:

.startAt(99, '-KlstB51ap1L2tcK8cL6')

使用该Firebase将查找所有具有
价格的物品
99
,然后返回从
键开始的物品-KlstB51ap1L2tcK8cL6'

第二堆栈溢出问题:第二堆栈溢出问题:谢谢!看起来第一个参数是“main”startAt标准,第二个参数作为一种消歧值,以防多个子项具有相同的值。这太棒了,非常感谢!我想知道如何通过REST使用此功能。如果有人能帮忙,这就是我在“谢谢”上的要求!看起来第一个参数是“main”startAt标准,第二个参数作为一种消歧值,以防多个子项具有相同的值。这太棒了,非常感谢!我想知道如何通过REST使用此功能。如果有人能帮忙,这就是我在