首页 > 解决方案 > 按子集合中的属性订购 Cosmos Db 集合

问题描述

我有以下类型的集合:

[
 {
     "id": "id1",
     "Tracks": [
     {
         "id": "trackid1",
         "Usage": 
         {
             "Daily": "145",
             "Ever": "21435"
         }
     },
     {
         "id": "trackid2",
         "Usage":
         {
             "Daily": "3456",
             "Ever": " 435676"
         }
     }
     ]
 }
]

如何获取按降序排列的 Usage Ever 排序的前 100 条记录?

这样做的原因是我们试图以 100 个为一组进行检索,并希望首先列出使用最多的项目。

编辑 1

排序后,数据应如下所示:

[
 {
     "id": "id1",
     "Tracks": [
     {
         "id": "trackid2",
         "Usage":
         {
             "Daily": "3456",
             "Ever": " 435676"
         }
     },
     {
         "id": "trackid1",
         "Usage": 
         {
             "Daily": "145",
             "Ever": "21435"
         }
     }
     ]
 }
]

标签: azure-cosmosdbazure-cosmosdb-sqlapi

解决方案


这将涉及使用ORDER BYCosmosDb 不支持的子查询。我建议在数据库外部进行排序,但如果您真的热衷于在数据库方面进行排序,那么使用用户定义的函数在技术上是可行的。例如:

用户定义函数:

function sortByString(array, sortBy) {
    return array.sort((a, b) => a[sortBy].localeCompare(b[sortBy]));
}

询问:

SELECT c.id, udf.sortByString(c.parents, 'givenName') as parents, c.children
FROM c
WHERE c.id = 'WakefieldFamily'

数据库入口:

{
  "id": "WakefieldFamily",
  "parents": [
      { "familyName": "Wakefield", "givenName": "Robin" },
      { "familyName": "Miller", "givenName": "Ben" }
  ],
  "children": [
      {
        "familyName": "Merriam", 
        "givenName": "Jesse", 
        "gender": "female", "grade": 1,
        "pets": [
            { "givenName": "Goofy" },
            { "givenName": "Shadow" }
        ]
      },
      { 
        "familyName": "Miller", 
         "givenName": "Lisa", 
         "gender": "female", 
         "grade": 8 }
  ],
  "address": { "state": "NY", "county": "Manhattan", "city": "NY" },
  "creationDate": 1431620462,
  "isRegistered": false
}

推荐阅读