Cosmos Db Sql 查询在使用 order by 时产生截然不同的结果
Cosmos Db Sql Query produces drastically different results when using order by
我有一个 Cosmos Db 实例,其中存储了超过 100 万个 JSON 个文档。
我正在尝试根据插入文档时自动生成的 _ts 变量提取文档创建时间的特定时间范围的数据。它代表那一刻的 UNIX 时间戳。
我无法理解为什么这两个查询会产生截然不同的结果:
查询 1:
Select *
from c
where c._ts > TimeStamp1
AND c._ts < TimeStamp2
产生 0 个结果
查询 2
Select *
from c
where c._ts > TimeStamp1
AND c._ts < TimeStamp2
order by c._ts desc
生成正确数量的结果。
我尝试了什么?
- 我怀疑这可能是因为数据上的默认 CosmosDb 索引。因此,我重写了索引策略以仅索引该变量。还是一样的问题。
- 因为我的最终目的是对查询返回的数据进行分组,所以我尝试单独或在子查询中使用 group by 和 order by。令人惊讶的是,根据文档,CosmosDb 还不支持使用 group by 和 order by。
我需要什么帮助?
- 为什么我会观察到这种行为?
- 有没有办法以返回行的方式对 Db 建立索引。
- 除此之外,有没有一种方法仍然可以同时使用 group by 和 order by(请不要 link 由于这一点而将问题转给另一个人,我已经通过了他们,他们的答案是对我来说无效)。
@Andy 和@Tiny-wa,感谢您的回复。
我能够理解意外行为,并且由于用于计算时间戳的 GetCurrentTimestamp() 而出现。文档指出
This system function will not utilize the index. If you need to
compare values to the current time, obtain the current time before
query execution and use that constant string value in the WHERE
clause.
虽然,我不完全理解这意味着什么,但我通过创建一个存储过程来解决这个问题,在该存储过程中,在形成和执行 SQLAPI 查询之前获取时间戳,并且我能够获取行预期。
存储过程伪代码如下:
function FetchData(){
..
..
..
var Current_TimeStamp = Date.now();
var CDbQuery =
`Select *
FROM c
where (c._ts * 10000000) > DateTimeToTicks(DateTimeAdd("day", -1, TicksToDateTime(` + Current_TimeStamp + ` * 10000)))
AND (c._ts * 10000000) < (` + Current_TimeStamp + ` * 10000)`
var isAccepted = collection.queryDocuments(
collection.getSelfLink(),
XQuery,
function (err, feed, options) {
..
..
..
});
}
我有一个 Cosmos Db 实例,其中存储了超过 100 万个 JSON 个文档。
我正在尝试根据插入文档时自动生成的 _ts 变量提取文档创建时间的特定时间范围的数据。它代表那一刻的 UNIX 时间戳。
我无法理解为什么这两个查询会产生截然不同的结果:
查询 1:
Select *
from c
where c._ts > TimeStamp1
AND c._ts < TimeStamp2
产生 0 个结果
查询 2
Select *
from c
where c._ts > TimeStamp1
AND c._ts < TimeStamp2
order by c._ts desc
生成正确数量的结果。
我尝试了什么?
- 我怀疑这可能是因为数据上的默认 CosmosDb 索引。因此,我重写了索引策略以仅索引该变量。还是一样的问题。
- 因为我的最终目的是对查询返回的数据进行分组,所以我尝试单独或在子查询中使用 group by 和 order by。令人惊讶的是,根据文档,CosmosDb 还不支持使用 group by 和 order by。
我需要什么帮助?
- 为什么我会观察到这种行为?
- 有没有办法以返回行的方式对 Db 建立索引。
- 除此之外,有没有一种方法仍然可以同时使用 group by 和 order by(请不要 link 由于这一点而将问题转给另一个人,我已经通过了他们,他们的答案是对我来说无效)。
@Andy 和@Tiny-wa,感谢您的回复。
我能够理解意外行为,并且由于用于计算时间戳的 GetCurrentTimestamp() 而出现。文档指出
This system function will not utilize the index. If you need to compare values to the current time, obtain the current time before query execution and use that constant string value in the WHERE clause.
虽然,我不完全理解这意味着什么,但我通过创建一个存储过程来解决这个问题,在该存储过程中,在形成和执行 SQLAPI 查询之前获取时间戳,并且我能够获取行预期。
存储过程伪代码如下:
function FetchData(){
..
..
..
var Current_TimeStamp = Date.now();
var CDbQuery =
`Select *
FROM c
where (c._ts * 10000000) > DateTimeToTicks(DateTimeAdd("day", -1, TicksToDateTime(` + Current_TimeStamp + ` * 10000)))
AND (c._ts * 10000000) < (` + Current_TimeStamp + ` * 10000)`
var isAccepted = collection.queryDocuments(
collection.getSelfLink(),
XQuery,
function (err, feed, options) {
..
..
..
});
}