我有以下收藏/文件
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());
});
});
期望是过滤“ GeoHashs”>“订购GeoHashs”>“按时间戳排序”。因此,最终结果应该是有序的时间戳,但我看到的是以下内容,
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' }
如您在上面的输出中看到的,我只是基于timeStamp查看Post 1> 2> 3,但是我在上面看到的是Post 2> 1> 3。
因此,您的工作查询是:
db.collection('locations')
.orderBy("geoHash")
.where('geoHash', '>=', range.lower)
.where('geoHash', '<=', range.upper)
.orderBy('timeStamp', 'DESC')
.limit(15).get()
从我所看到的结果中,您得到的结果是按排序的geoHash
,然后才按排序timeStamp
。因此:如果两个文档具有相同的geoHash
值,则它们将按其timeStamp
值顺序排列。
这按预期工作:在字段上进行范围查询时,始终始终需要首先对该字段进行排序。而且,由于您首先对该字段进行排序,因此结果将以该字段的顺序返回。
这是Firestore的查询模型所固有的,因此可能有助于进一步了解。.性能保证意味着一旦找到查询的起点,它就必须始终能够从数据库中流式传输结果。对未知数量的结果重新排序将使始终无法满足性能保证成为不可能,因此不支持此操作。
为了按时间戳顺序获得结果,您需要在应用程序代码中对它们重新排序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句