使用 ORDER BY 查询 CosmosDB 子集合

Posted

技术标签:

【中文标题】使用 ORDER BY 查询 CosmosDB 子集合【英文标题】:Querying CosmosDB Child Collection using ORDER BY 【发布时间】:2021-12-18 04:06:21 【问题描述】:

假设我对每个 userId 都有一个如下所示的文档。每个 userId 都有一个名为“lnk”的子集合对象,每个 userId 最多可以增长 100 个项目。

我想根据单个属性对给定 userId 的子集合进行排序 (例如:主题或 Pid 或 URL)。对于用户 ID =“5663a8f7-6d2e-40ef-8972-515944080474”

SELECT * FROM c IN PageLinksContainer.lnk order by c.top asc OFFSET 1 LIMIT  3

我得到的错误:

Failed to query item for container PageLinksContainer:

  "errors": [
    
      "severity": "Error",
      "location": 
        "start": 7,
        "end": 25
      ,
      "code": "SC2001",
      "message": "Identifier 'PageLinksContainer' could not be resolved."
    ,
    
      "severity": "Error",
      "location": 
        "start": 67,
        "end": 85
      ,
      "code": "SC2001",
      "message": "Identifier 'PageLinksContainer' could not be resolved."
    
  ]
 

    "userid": "5663a8f7-6d2e-40ef-8972-515944080474",
    "lnk": [
        
            "pid": 1,
            "top": "Topic 1",
            "por": "www.google.com",
            "sdt": "10/26/2021"
        ,
        
            "pid": 2,
            "top": "Topic 2",
            "por": "www.google.com",
            "sdt": "10/26/2021"
        ,
        
            "pid": 3,
            "top": "Topic 3",
            "por": "www.google.com",
            "sdt": "10/26/2021"
        
    ]

C#

 var query = "SELECT * FROM c IN PageLinksContainer.lnk OFFSET 1 LIMIT  10"; //Works fine with no order by.

 var container = _cosmosClient.GetContainer(_databaseName, containerName);

 using var iterator = container.GetItemQueryStreamIterator(new QueryDefinition(query),
                requestOptions: new QueryRequestOptions
                
                    PartitionKey = new PartitionKey("5663a8f7-6d2e-40ef-8972-515944080474"),
                    MaxItemCount = 100
                );

链接:

https://docs.microsoft.com/en-us/azure/cosmos-db/sql/sql-query-order-by

CosmosDB sql query with/without "ORDER BY" returns different number of items

【问题讨论】:

【参考方案1】:

您目前不能ORDER BY 数组中的属性。

以下查询更好地证明了以下错误Order-by over correlated collections is not supported

SELECT VALUE l
FROM c
JOIN l IN c.lnk
ORDER BY l.por

您可以做的是创建一个用户定义函数,在返回之前对数组进行排序。虽然我建议您检索结果并在 C# 代码中使用 OrderBy,因为它更容易、更透明,并且避免在 UDF 上花费不必要的 RU。

【讨论】:

你是对的。我在想同样得到 100 个结果并在 C# 中使用 order by 我可以很容易地做到这一点。谢谢。顺便说一句-由于我没有足够的声誉,我无法为您的答案投票。我稍后再做。

以上是关于使用 ORDER BY 查询 CosmosDB 子集合的主要内容,如果未能解决你的问题,请参考以下文章

子查询中不允许用order by子句,那么应该怎么办?

mysql使用带有子查询的临时表,但不是group by和order by

在 group by 中使用 datetime 日期并在单个 SELECT 中使用 order by 与使用子查询

子查询中的 Order By 的 SQL 错误

在 JPA Criteria API 的子查询中使用 ORDER BY 的替代方法是啥?

order by中用子查询排序