Cosmos查询只获取满足特定条件的特定内部数组项



在cosmos DB中,文档结构类似于

[
{
"id": "1",
"Plants": [
{
"PlantId": 3,
"UniqueQualityId": "3_pe55d74fc5f92b11ab3fe"
},
{
"PlantId": 4,
"UniqueQualityId": "3_pe55d74fc5sdfmsdfklms"
},
{
"PlantId": 10,
"UniqueQualityId": "3_pe55d7akjdsj6ysdssdsd"
},
{
"PlantId": 12,
"UniqueQualityId": "5_fdffpe55d7akjdsj6ysds"
}
],
"CompletionTime": 36
},
{
"id": "2",
"Plants": [
{
"PlantId": 3,
"UniqueQualityId": "3_pe55d74fc5f92b11ab3fe"
},
{
"PlantId": 4,
"UniqueQualityId": "3_pe55d74fc5sdfmsdfklms"
},
{
"PlantId": 3,
"UniqueQualityId": "3_pe55d74fc5f92b11ab3fe"
},
{
"PlantId": 5,
"UniqueQualityId": "3_pe55d7akjdsj6ysdssdsd"
}
],
"CompletionTime": 36
},
{
"id": "2",
"Plants": [
{
"PlantId": 10,
"UniqueQualityId": "3_pe55d74fc5f92b11ab3fe"
},
{
"PlantId": 11,
"UniqueQualityId": "3_pe55d74fc5sdfmsdfklms"
}
],
"CompletionTime": 36
}
]

我需要收集符合特定条件的植物:

例如,查询被写为提取Plants以及一些父数据,其中PlantId在("3","4"(中,则预期的输出是

[
{
"id": "1",
"Plants": [
{
"PlantId": 3,
"UniqueQualityId": "3_pe55d74fc5f92b11ab3fe"
},
{
"PlantId": 4,
"UniqueQualityId": "3_pe55d74fc5sdfmsdfklms"
}
],
"CompletionTime": 36
},
{
"id": "2",
"Plants": [
{
"PlantId": 3,
"UniqueQualityId": "3_pe55d74fc5f92b11ab3fe"
},
{
"PlantId": 4,
"UniqueQualityId": "3_pe55d74fc5sdfmsdfklms"
}
}
],
"CompletionTime": 36
}
]

在植物数组中,它应该只包含满足过滤条件的项目。

我尝试了以下方法

SELECT root["Plants"],root.id FROM root 
WHERE EXISTS(select value plant FROM plant in root.Plants WHERE plant.PlantId in ("3","4"))
SELECT root.id,root.Plants FROM root where ARRAY_CONTAINS(c.Plants,{"PlantId": "3"},true)

如果任何工厂项目符合条件,则返回整个工厂阵列,而不是特定项目。

是否有任何方法只返回满足条件的特定数组项?

您可以使用以下查询来获得结果以获得您想要的输出:

SELECT 
c.id,
ARRAY(
SELECT VALUE p
FROM p IN c.Plants
WHERE p.PlantId IN (3, 4)
) AS Plants,
c.CompletionTime
FROM c

尽管我个人的偏好是下面的查询,它也会做同样的事情,但会为每株植物创建一个单独的项目。从上下文中,我了解到您正在寻找特定的植物,并在结果中捕获一些亲本数据。在这种情况下,由工厂单独得出结果是有意义的。

SELECT 
c.id,
p AS Plant,
c.CompletionTime
FROM c
JOIN 
(
SELECT VALUE p 
FROM p IN c.Plants
WHERE p.PlantId IN (3, 4)
) AS p