CosmosDB 按值将结果排序到数组中
CosmosDB sort results by a value into an array
我有一些 CosmosDB 文档,如下所示
{
"ProductId": 1,
"Status": true,
"Code": "123456",
"IsRecall": false,
"ScanLog": [
{
"Location": {
"type": "Point",
"coordinates": [
13.5957758,
42.7111538
]
},
"TimeStamp": 201602160957190600,
"ScanType": 0,
"UserId": "1004"
},
{
"Location": {
"type": "Point",
"coordinates": [
13.5957907,
42.7111359
]
},
"TimeStamp": 201602161246336640,
"ScanType": 0,
"UserId": "1004"
}
]
}
如何按时间戳对查询结果排序属性?我试过使用这个查询
SELECT c.Code, b.TimeStamp FROM c JOIN b IN c.ScanLog ORDER BY b.TimeStamp
但是我收到这个错误
Order-by over correlated collections is not supported.
正确的做法是什么?
目前不支持使用 ORDER BY 的 JOIN。
但是,这里有一个用户定义函数 (UDF) 可以解决问题:
function sortScanLog (scanLog) {
function compareTimeStamps(a, b) {
return a.TimeStamp - b.TimeStamp;
}
return scanLog.sort(compareTimeStamps);
}
您使用这样的查询:
SELECT c.ProductId, udf.sortScanLog(c.ScanLog) as ScanLog FROM c
如果您想要相反的排序顺序,只需交换 a 和 b。因此,compareTimeStamps 内部函数的签名为:
function compareTimeStamps(b, a)
或者,您可以在返回结果后对客户端进行排序。
目前不支持与 JOIN 混合的 ORDER BY 子句,引擎可以查看 JOIN 操作的索引属性,但无法根据 JOIN 结果重新排序结果。
你必须使用 Larry 提供的东西,或者在查询上执行 JOIN 并在结果到达后通过你自己的代码进行排序,如果你使用 C#,你可以使用 Linq 对它们进行排序。
我有一些 CosmosDB 文档,如下所示
{
"ProductId": 1,
"Status": true,
"Code": "123456",
"IsRecall": false,
"ScanLog": [
{
"Location": {
"type": "Point",
"coordinates": [
13.5957758,
42.7111538
]
},
"TimeStamp": 201602160957190600,
"ScanType": 0,
"UserId": "1004"
},
{
"Location": {
"type": "Point",
"coordinates": [
13.5957907,
42.7111359
]
},
"TimeStamp": 201602161246336640,
"ScanType": 0,
"UserId": "1004"
}
]
}
如何按时间戳对查询结果排序属性?我试过使用这个查询
SELECT c.Code, b.TimeStamp FROM c JOIN b IN c.ScanLog ORDER BY b.TimeStamp
但是我收到这个错误
Order-by over correlated collections is not supported.
正确的做法是什么?
目前不支持使用 ORDER BY 的 JOIN。
但是,这里有一个用户定义函数 (UDF) 可以解决问题:
function sortScanLog (scanLog) {
function compareTimeStamps(a, b) {
return a.TimeStamp - b.TimeStamp;
}
return scanLog.sort(compareTimeStamps);
}
您使用这样的查询:
SELECT c.ProductId, udf.sortScanLog(c.ScanLog) as ScanLog FROM c
如果您想要相反的排序顺序,只需交换 a 和 b。因此,compareTimeStamps 内部函数的签名为:
function compareTimeStamps(b, a)
或者,您可以在返回结果后对客户端进行排序。
目前不支持与 JOIN 混合的 ORDER BY 子句,引擎可以查看 JOIN 操作的索引属性,但无法根据 JOIN 结果重新排序结果。
你必须使用 Larry 提供的东西,或者在查询上执行 JOIN 并在结果到达后通过你自己的代码进行排序,如果你使用 C#,你可以使用 Linq 对它们进行排序。