Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.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 Firestore一个范围查询,在不同字段上按订单排序_Javascript_Firebase_Dart_Google Cloud Firestore - Fatal编程技术网

Javascript Firestore一个范围查询,在不同字段上按订单排序

Javascript Firestore一个范围查询,在不同字段上按订单排序,javascript,firebase,dart,google-cloud-firestore,Javascript,Firebase,Dart,Google Cloud Firestore,我有以下收集/文件 Location Collection { "geoHash" : "wwscjrm3nu01", "timeStamp" : "March 25, 2020 at 1:07:38 PM UTC-4" } { "geoHash" : "wwscjrm2wc2h", "timeStamp" : "March 25, 2020 at 2:07:38 PM UTC-4" } 请用上面的示例替换geohash 因此,我试图通过按时间戳DESC排序来查询一系列ge

我有以下收集/文件

Location Collection
{
  "geoHash" : "wwscjrm3nu01",
  "timeStamp" : "March 25, 2020 at 1:07:38 PM UTC-4" 
}
{
  "geoHash" : "wwscjrm2wc2h",
  "timeStamp" : "March 25, 2020 at 2:07:38 PM UTC-4" 
}
请用上面的示例替换geohash

因此,我试图通过按时间戳DESC排序来查询一系列geohash,如下所示

    db.collection('location')
        .where('geoHash', '>=', 'wwkxt4kxmmvk')
        .where('geoHash', '<=', 'wwt4vsn22peq')
        .orderBy('timeStamp', 'DESC')
        .limit(15).get()
如果我每个月或每天在这个集合中有数千或数百万个文档,该怎么办!?你们当中有人面临这个问题吗?解决这个问题的最佳方法是什么

更新0.2

我非常感谢你在解决这个问题上的帮助和支持。我复制了我最后看到的东西

目前,我正在对节点js使用以下查询

db.集合“位置” .where'geoHash','>=','wwwkxt4kxmmvk' .where'geoHash','正如您在中所看到的,在不同字段上执行范围筛选和第一个orderBy操作在Firestore中是无效的

此外,如果您尝试按倍数排序,请记住,您将按第一个orderBy排列所有结果,然后,如果有类似的结果,则将按第二个orderBy排列。在您的情况下,您将首先按geoHash排列所有结果,然后按geoHash排列,这将按日期排序,但是,在Firestore中,只有类似的条目是无效的,正如您在不同字段上执行范围筛选和第一个orderBy时所看到的那样


此外,如果您尝试按倍数排序,请记住,您将按第一个orderBy排列所有结果,然后,如果有类似的结果,则将按第二个orderBy排列。在您的情况下,您将首先按geoHash排列所有结果,然后按geoHash排列,这将按日期排序,但是只有这些相似的条目

,因此您的工作查询是:

db.collection('locations')
  .orderBy("geoHash")
  .where('geoHash', '>=', range.lower)
  .where('geoHash', '<=', range.upper)
  .orderBy('timeStamp', 'DESC')
  .limit(15).get()
从我看到的结果是按geoHash排序的,然后才按时间戳排序。因此:如果两个文档具有相同的geoHash值,那么它们将按照时间戳值的顺序排列

这是按预期工作的:当您对字段执行范围查询时,您总是首先需要对该字段进行排序。既然你对这个字段进行了第一次排序,结果就会按照这个字段的顺序返回

这是Firestore查询模型的固有特性,因此了解更多信息可能会有所帮助。。它的性能保证意味着,一旦找到了查询的起点,它就必须始终能够从数据库流式传输结果。对未知数量的结果重新排序将使其无法始终满足性能保证,因此不支持此操作


要按时间戳的顺序获取结果,您需要在应用程序代码中对其重新排序。

因此,您的工作查询是:

db.collection('locations')
  .orderBy("geoHash")
  .where('geoHash', '>=', range.lower)
  .where('geoHash', '<=', range.upper)
  .orderBy('timeStamp', 'DESC')
  .limit(15).get()
从我看到的结果是按geoHash排序的,然后才按时间戳排序。因此:如果两个文档具有相同的geoHash值,那么它们将按照时间戳值的顺序排列

这是按预期工作的:当您对字段执行范围查询时,您总是首先需要对该字段进行排序。既然你对这个字段进行了第一次排序,结果就会按照这个字段的顺序返回

这是Firestore查询模型的固有特性,因此了解更多信息可能会有所帮助。。它的性能保证意味着,一旦找到了查询的起点,它就必须始终能够从数据库流式传输结果。对未知数量的结果重新排序将使其无法始终满足性能保证,因此不支持此操作


要按时间戳的顺序获得结果,您需要在应用程序代码中对它们进行重新排序。

您的两个条件似乎位于同一字段上,因此它似乎与您链接的我的答案大不相同。1此查询有什么不起作用?2.您能否显示无法正常工作的文档的屏幕截图?3最后:你能用range.lower和range.upper的硬编码值复制并编辑你的问题来显示这些值吗?谢谢@FrankvanPuffelen,我已经更新了这篇文章,涵盖了你提到的所有要点,在Firestore方面,地理哈希的计算方式并不重要。你能用硬编码的geohash值复制,然后使用问题中的值吗?这里的目标是排除尽可能多的代码,从而使问题在您的身边,因此我们必须考虑更少。对于错误消息:听起来您需要在WHERE子句之前添加OrthByGeGHASHASH。这也意味着您需要定义一个复合索引,但会有一条带有直接链接的错误消息来帮助您。两种方式的结果都不是按时间戳排序的。请不要说结果不是什么,而是显示结果是什么,以及您对结果的预期。请注意,它们将主要由geoHash排序,并且仅在之后的时间戳上排序。这是出于设计,也是API要求您添加额外orderBy的原因之一,因此排序顺序首先是geoHash,然后

然后在时间戳上。你们的两个条件似乎在同一个字段上,所以它似乎与我的答案有很大的不同。1此查询有什么不起作用?2.您能否显示无法正常工作的文档的屏幕截图?3最后:你能用range.lower和range.upper的硬编码值复制并编辑你的问题来显示这些值吗?谢谢@FrankvanPuffelen,我已经更新了这篇文章,涵盖了你提到的所有要点,在Firestore方面,地理哈希的计算方式并不重要。你能用硬编码的geohash值复制,然后使用问题中的值吗?这里的目标是排除尽可能多的代码,从而使问题在您的身边,因此我们必须考虑更少。对于错误消息:听起来您需要在WHERE子句之前添加OrthByGeGHASHASH。这也意味着您需要定义一个复合索引,但会有一条带有直接链接的错误消息来帮助您。两种方式的结果都不是按时间戳排序的。请不要说结果不是什么,而是显示结果是什么,以及您对结果的预期。请注意,它们将主要由geoHash排序,并且仅在之后的时间戳上排序。这是出于设计,也是API要求您添加额外orderBy的原因之一-因此,排序顺序首先是geoHash,然后是时间戳。谢谢你,Chris,我已经在帖子中复制了结果和期望值。好的,我将尝试更清楚地回答。根据文档,您尝试执行的操作无效。您对新查询所做的是对所有geoHash进行排序,然后,每当您有2个或更多类似的geoHash时,这对将按日期排序,而不是按整个数组排序。您的查询的实际输出是该特定查询的预期输出,为什么?因为它将您的geoHash排序为wwscjrm3nu01>wwscjrm3nu01>wwscjrm2wc2h,然后因为您有两次wwscjrm3nu01,所以它只将此geoHash的时间戳排序为1585317000>158527600。第二个orderBy不会对其他geoHash进行重新排序。如果您希望所有结果按日期排序,那么您需要做的是按日期选择结果,而不是按geoHashI完全理解这里的情况。非常感谢你的解释。谢谢你,克里斯,我已经在帖子中转载了结果和期望。好的,我会尽量更清楚地回答。根据文档,您尝试执行的操作无效。您对新查询所做的是对所有geoHash进行排序,然后,每当您有2个或更多类似的geoHash时,这对将按日期排序,而不是按整个数组排序。您的查询的实际输出是该特定查询的预期输出,为什么?因为它将您的geoHash排序为wwscjrm3nu01>wwscjrm3nu01>wwscjrm2wc2h,然后因为您有两次wwscjrm3nu01,所以它只将此geoHash的时间戳排序为1585317000>158527600。第二个orderBy不会对其他geoHash进行重新排序。如果您希望所有结果按日期排序,那么您需要做的是按日期选择结果,而不是按geoHashI完全理解这里的情况。非常感谢你的解释。回答得好,弗兰克!明白了,谢谢,这里有个简单的问题。通过在客户端订购它们,您推荐的是什么,我想对数千或数百万文档无效,您对解决此问题的建议是什么?我正在考虑使用与functions/集成的Cloud SQL MySQL。因为您只检索15个文档,所以这应该不是问题。一般来说:您应该只从Firestore请求您的用户实际将要看到的数据,因此数百万文档是一个不太可能的数字。当我看到开发人员检索大量文档时,通常是因为他们正在进行客户端聚合。虽然这是一个有效的选择,但它浪费了用户的带宽和您的钱,因为您正在阅读许多无法显示的文档。看来你是对的!,但我的意思是,如果用户只想看到今天的帖子,并按时间排序等等,而我的查询不能保证今天帖子的gethash的所有不同值的降序,那么它可能会带来其他日期的帖子。是的,这是正确的。这是一个完全独立的问题,但我建议在这里阅读我的解释:令人惊讶的是,它缺少任何令人信服的答案,弗兰克!明白了,谢谢,这里有个简单的问题。通过在客户端订购它们,您推荐的是什么,我想对数千或数百万文档无效,您对解决此问题的建议是什么?我正在考虑使用与functions/集成的Cloud SQL MySQL。因为您只检索15个文档,所以这应该不是问题。一般来说:您应该只从Firestore请求您的用户实际将要看到的数据,因此数百万文档是一个不太可能的数字。当我看到开发人员检索大量文档时
,这通常是因为他们正在进行客户端聚合。虽然这是一个有效的选择,但它浪费了用户的带宽和您的钱,因为您正在阅读许多无法显示的文档。看来你是对的!,但我的意思是,如果用户只想看到今天的帖子,并按时间排序等等,而我的查询不能保证今天帖子的gethash的所有不同值的降序,那么它可能会带来其他日期的帖子。是的,这是正确的。这是一个完全独立的问题,但我建议在这里阅读我的解释:令人惊讶的是,它缺少任何投票权