我对 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
}
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)