如何筛选 Azure Cosmos DB 子阵列

der*_*vil 0 c# azure-cosmosdb azure-cosmosdb-sqlapi

我在 Azure Cosmos DB 中有以下数据。我想根据between data.date和过滤数据contains employee.full_name。以下查询给出了不需要的结果。我真的需要帮助来解决这个问题。此链接如何使用 Cosmos DB 查询嵌套数组似乎不符合我的预期结果。

Cosmos DB 数据

    {
      "id": "ED-BSC1",
      "data": [
        {
          "date": "2023-05-09",
          "employees": [
            {
              "employee_id": "E3948",
              "full_name": "Donni",
              "loc": "Building F",
              "floor": 5
            },
            {
              "employee_id": "E9372",
              "full_name": "Viona",
              "loc": "Building F",
              "floor": 5
            },
            {
              "employee_id": "E4551",
              "full_name": "Abby",
              "loc": "Building A",
              "floor": 6
            }
          ]
        },
        {
          "date": "2023-05-10",
          "employees": [
            {
              "employee_id": "E9032",
              "full_name": "Brian",
              "loc": "Building A",
              "floor": 12
            },
            {
              "employee_id": "E9033",
              "full_name": "Emma",
              "loc": "Building A",
              "floor": 11
            },
            {
              "employee_id": "E9034",
              "full_name": "Emily",
              "loc": "Building A",
              "floor": 11
            }
          ]
        },
        {
          "date": "2023-05-11",
          "employees": [
            {
              "employee_id": "E1042",
              "full_name": "Diana",
              "loc": "Building C",
              "floor": 14
            },
            {
              "employee_id": "E5323",
              "full_name": "Dereck",
              "loc": "Building A",
              "floor": 11
            },
            {
              "employee_id": "E9034",
              "full_name": "Emily",
              "loc": "Building B",
              "floor": 19
            }
          ]
        }
      ]
    }
Run Code Online (Sandbox Code Playgroud)

我正在使用此查询来实现这一目标,但失败了。它仍然显示整个数据

    SELECT
        c.id,
        c.data
    from 
        c 
        join d in c.data 
        join e in d.employees   
    where 
        c.id = 'ED-BSC1' 
        and d.date >= '2023-05-10' 
        and d.date <= '2023-05-11' 
        and e.full_name like '%Em%'
Run Code Online (Sandbox Code Playgroud)

这是上面查询的预期结果

    {
      "id": "ED-BSC1",
      "data": [
        {
          "date": "2023-05-10",
          "employees": [
            {
              "employee_id": "E9033",
              "full_name": "Emma",
              "loc": "Building A",
              "floor": 11
            },
            {
              "employee_id": "E9034",
              "full_name": "Emily",
              "loc": "Building A",
              "floor": 11
            }
          ]
        },
        {
          "date": "2023-05-11",
          "employees": [
            {
              "employee_id": "E9034",
              "full_name": "Emily",
              "loc": "Building B",
              "floor": 19
            }
          ]
        }
      ]
    }
Run Code Online (Sandbox Code Playgroud)

小智 6

我想根据between data.date和过滤数据contains employee.full_name。以下查询给出了不需要的结果。

SELECT c.id,
ARRAY(
        SELECT VALUE 
        {
            "date": d.date,
            "employees": ARRAY(               
                SELECT VALUE e FROM e IN d.employees                
                WHERE CONTAINS(e.full_name, "Em")
            )
        }
        
        FROM d IN c.data WHERE d.date >= '2023-05-10' AND d.date <= '2023-05-11'          
        
    ) AS data FROM c WHERE c.id = 'ED-BSC1'
Run Code Online (Sandbox Code Playgroud)

以下是期望的结果:

[
    {
        "id": "ED-BSC1",
        "data": [
            {
                "date": "2023-05-10",
                "employees": [
                    {
                        "employee_id": "E9033",
                        "full_name": "Emma",
                        "loc": "Building A",
                        "floor": 11
                    },
                    {
                        "employee_id": "E9034",
                        "full_name": "Emily",
                        "loc": "Building A",
                        "floor": 11
                    }
                ]
            },
            {
                "date": "2023-05-11",
                "employees": [
                    {
                        "employee_id": "E9034",
                        "full_name": "Emily",
                        "loc": "Building B",
                        "floor": 19
                    }
                ]
            }
        ]
    }
]
Run Code Online (Sandbox Code Playgroud)
  • 以下是 Cosmos DB 中查询运行的屏幕截图以及输出。