【发布时间】:2020-03-26 16:46:58
【问题描述】:
我有以下收藏/文档
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"
}
请用上面的例子替换 GeoHashs#
所以,我试图通过时间戳“DESC”来查询这些 GeoHash 的范围,如下所示
db.collection('location')
.where('geoHash', '>=', 'wwkxt4kxmmvk')
.where('geoHash', '<=', 'wwt4vsn22peq')
.orderBy('timeStamp', 'DESC')
.limit(15).get()
没用,请看下面的错误
Error getting documents { Error: 3 INVALID_ARGUMENT: inequality filter property and first sort order must be the same: geoHash and timeStamp
at callErrorFromStatus (/srv/node_modules/@grpc/grpc-js/build/src/call.js:30:26)
at Http2CallStream.call.on (/srv/node_modules/@grpc/grpc-js/build/src/call.js:79:34)
at emitOne (events.js:121:20)
at Http2CallStream.emit (events.js:211:7)
at process.nextTick (/srv/node_modules/@grpc/grpc-js/build/src/call-stream.js:97:22)
at _combinedTickCallback (internal/process/next_tick.js:132:7)
at process._tickDomainCallback (internal/process/next_tick.js:219:9)
code: 3,
details: 'inequality filter property and first sort order must be the
same: geoHash and timeStamp',
metadata: Metadata { internalRepr: Map {}, options: {} } }
如果我每月或每天在此集合中有数千或数百万个文档怎么办!?你们中的任何人都面临这个问题吗?解决这个问题的最佳方法是什么?
更新 0.2
非常感谢您在解决此问题方面的帮助和支持。我已经复制了我最后看到的内容。
目前,我在 Node js 中使用以下查询
db.collection('locations')
.where('geoHash', '>=', 'wwkxt4kxmmvk')
.where('geoHash', '<=', 'wwt4vsn22peq')
.orderBy('geoHash')
.orderBy('timeStamp', 'desc')
.limit(15).get().then(snapshot => {
if (snapshot.empty) {
console.log('No matching documents.');
}
snapshot.forEach(doc => {
console.log(doc.data());
});
});
期望是过滤 GeoHash > 对 GeoHash 排序 > 按时间戳排序。因此,最终结果假设为有序时间戳,但我看到的是以下内容,
10:08:24.901 AM
test
{ geoHash: 'wwscjrm3nu01',
timeStamp: Timestamp { _seconds: 1585227600, _nanoseconds: 0 },
post: '3' }
10:08:24.900 AM
test
{ geoHash: 'wwscjrm3nu01',
timeStamp: Timestamp { _seconds: 1585317000, _nanoseconds: 0 },
post: '1' }
10:08:24.900 AM
test
{ geoHash: 'wwscjrm2wc2h',
timeStamp: Timestamp { _seconds: 1585314000, _nanoseconds: 0 },
post: '2' }
正如您在上面的输出中看到的,我除了看到基于时间戳的帖子 1 > 2 > 3,但我在上面看到的是帖子 2 > 1 > 3。
【问题讨论】:
-
您的两个条件似乎都在同一个字段上,因此与您链接的我的答案似乎完全不同。 1) 这个查询有什么问题? 2) 您能否显示无法正常工作的文档的屏幕截图? 3)最后:你能用
range.lower和range.upper的硬编码值重现并编辑你的问题以显示这些值吗? -
谢谢@FrankvanPuffelen,我已经更新了你提出的所有观点的帖子,
-
在 Firestore 方面,如何计算 geohashes 并不重要。您可以使用硬编码的 geohash 值进行复制,然后在问题中使用这些值吗?这里的目标是排除尽可能多的代码,尽可能多地在您这边造成问题,这样我们就必须考虑更少。
-
对于错误消息:听起来您需要在
where子句之前添加orderBy("geoHash")。这也意味着您需要定义一个复合索引,但是会出现一条错误消息,其中包含一个直接链接来帮助您。 -
Both ways the results were not ordered by timeStamp请不要说结果不是,而是显示结果是,以及您对结果的期望。请注意,它们将主要由geoHash订购,之后仅在timeStamp上订购。这是设计使然,也是 API 要求您添加额外的orderBy()的原因之一 - 以便明确排序顺序首先是geoHash,然后是timeStamp。
标签: javascript firebase dart google-cloud-firestore