CosmosDB 按值将结果排序到数组中

Mat*_*teo 5 azure azure-cosmosdb

我有一些 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"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

如何通过 TimeStamp 属性对查询结果进行排序?我试过使用这个查询

SELECT c.Code, b.TimeStamp FROM c JOIN b IN c.ScanLog ORDER BY b.TimeStamp
Run Code Online (Sandbox Code Playgroud)

但我收到此错误

Order-by over correlated collections is not supported.
Run Code Online (Sandbox Code Playgroud)

这样做的正确方法是什么?

Lar*_*one 6

目前不支持使用 ORDER BY 进行 JOIN。

然而,这里有一个用户定义的函数(UDF)可以解决这个问题:

function sortScanLog (scanLog) { 
  function compareTimeStamps(a, b) {
    return a.TimeStamp - b.TimeStamp;
  }
  return scanLog.sort(compareTimeStamps);
}
Run Code Online (Sandbox Code Playgroud)

您可以使用这样的查询:

SELECT c.ProductId, udf.sortScanLog(c.ScanLog) as ScanLog FROM c
Run Code Online (Sandbox Code Playgroud)

如果您想要相反的排序顺序,只需交换 a 和 b 即可。因此,compareTimeStamps 内部函数的签名为:

function compareTimeStamps(b, a)
Run Code Online (Sandbox Code Playgroud)

或者,您可以在返回结果后在客户端进行排序。