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

Cosmos query to fetch only specific inner array items that meets specific condition

在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
  }
]

我需要获取满足特定条件的植物集合:

例如,查询写成 fetch Plants 以及一些父数据,其中 PlantId in ("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
  }
]

这里plants数组应该只包含满足过滤条件的项目。

我试过以下方法

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)

如果任何植物项目满足条件,则 return 将整个植物阵列而不是特定项目。

有什么方法可以只return满足条件的特定数组项吗?

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

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