【问题标题】:CosmosDB sort results by a value into an arrayCosmosDB 按值将结果排序到数组中
【发布时间】:2016-06-05 17:10:58
【问题描述】:

我有一些 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"
    }
  ]
}

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

SELECT c.Code, b.TimeStamp FROM c JOIN b IN c.ScanLog ORDER BY b.TimeStamp

但我收到此错误

Order-by over correlated collections is not supported.

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

【问题讨论】:

    标签: azure azure-cosmosdb


    【解决方案1】:

    目前不支持使用 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)
    

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

    【讨论】:

    • 我不认为分页适用,因为我们正在排序的数组是根文档的子元素。你要么全部得到,要么没有。
    • 对不起,拉里。我的意思是,如果我在 LINQ 中对返回的数据进行排序,那么任何延续令牌的概念都会消失。因此,如果我尝试进行任何分页并且我有一个 JOIN,MaxItemCount 将无济于事。
    • 啊 LINQ。我使用 node.js,所以我不是 LINQ 用户。
    • 我不认为排序工具有什么不同,对吧?如果您要检索部分数据并仅在客户端对其进行排序,那么谁知道下一页是什么?要对结果进行排序,您必须获取所有结果,然后不再分页。
    【解决方案2】:

    目前,不支持与 JOIN 混合的 ORDER BY 子句,引擎可以查看 JOIN 操作的索引属性,但无法根据 JOIN 结果重新排序结果。

    您必须使用 Larry 提供的类似方法,或者在结果到达后对查询进行 JOIN 和排序,如果您使用 C#,则可以使用 Linq 对它们进行排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-15
      相关资源
      最近更新 更多