需要帮助压平 Cosmos 中的多数组项

问题描述 投票:0回答:1

我对 Cosmos 还有些缺乏经验。我有一个多数组项目需要展平。我们拥有的是具有可变数量资源的多个项目项。每个资源还具有可变数量的可以与之相关的源系统。

我需要做的是将数据过滤到特定的源系统,显示与该源系统相关的所有资源,然后显示一些项目详细信息。例如,输出看起来像这样......

personName、sourceSystem、(项目的)名称

Jane Doe,Z,测试项目

John Smith,Z,测试项目

除了过滤源系统“Z”之外,我还想过滤去年项目的开始日期。

以下是单个项目项的外观示例:

{
"resources": [
    {
        "personName": "Jane Doe",
        "displayInfo": null,
        "primaryKeys": [
            {
                "sourceSystemId": "99",
                "sourceSystem": "Z",
                "name": "Id",
                "type": "ProjectResource",
                "isActive": true,
                "isGold": true
            }
        ],
        "primaryUrl": null
    },
    {
        "personName": "John Smith",
        "displayInfo": null,
        "primaryKeys": [
            {
                "sourceSystemId": "99",
                "sourceSystem": "Z",
                "name": "Id",
                "type": "ProjectResource",
                "isActive": true,
                "isGold": true
            },
            {
                "sourceSystemId": "88",
                "sourceSystem": "Y",
                "name": "Id",
                "type": "ProjectResource",
                "isActive": true,
                "isGold": true
            }
        ],
        "primaryUrl": null
    }
],
"name": "Test Project",
"startDate": "2016-01-01T00:00:00",
"endDate": "2019-12-31T00:00:00",
"primaryKeys": [
    {
        "sourceSystemId": "9999",
        "sourceSystem": "Something",
        "name": "Id",
        "type": "Project",
        "isActive": true,
        "isGold": true
    }
],
"primaryUrl": null,
"isActive": true,
"isDeleted": false

}

azure-cosmosdb hierarchical-data
1个回答
0
投票

CosmosDB 提供了 JOIN 功能,允许在单个项目中进行连接。 对于您想要将具有“resources”的项目展平为数组,然后将“primaryKeys”展平为具有“sourceSystem”的“resources”中的数组的场景,您可以使用

JOIN
关键字在项目内执行自连接首先在
resources
,然后在
primaryKeys

根据您的示例,您正在寻找 3 个字段

personName、sourceSystem、(项目的)名称

因此,以扁平形式提供这 3 个字段信息的 cosmosDB 查询将是

SELECT project.name, resource.personName, key.sourceSystem
FROM project
JOIN resource IN project.resources
JOIN key IN resource.primaryKeys

展平后的项目的结构将是-

{
    "name": "Test Project",
    "personName": "Jane Doe",
    "sourceSystem": "Z"
}

接下来,如果我们必须过滤某些内容,那么我们必须使用

WHERE
关键字,后跟要过滤的条件

因此,考虑到您谈论能够将

sourceSystem
过滤为
Z
的示例,查询将是-

SELECT project.name, resource.personName, key.sourceSystem
FROM project
JOIN resource IN project.resources
JOIN key IN resource.primaryKeys
WHERE key.sourceSystem = 'Z'

此外,如果您想过滤项目的开始日期以获取去年内的某些内容,您可以使用日期和时间函数

DateTimeAdd
之一来实现此目的。查询看起来像这样 -

SELECT project.name, resource.personName, key.sourceSystem
FROM project
JOIN resource IN project.resources
JOIN key IN resource.primaryKeys
WHERE key.sourceSystem = 'Z' AND project.startDate > DateTimeAdd('yyyy', -1, CURRENT_TIMESTAMP)
© www.soinside.com 2019 - 2024. All rights reserved.