在Cosmos SQL上查询

时间:2019-04-03 04:50:58

标签: azure azure-cosmosdb azure-cosmosdb-sqlapi

我已经阅读了Azure宇宙文档,目前它说不允许在同一数据库中加入2个不同的集合。 在实现以下方案时,我需要帮助。 以下是Cosmos DB中的文档。我也使用SQL API。

以下所有文档都在同一集合中。 “ id”是分区键

文档1:

{
    "id": "12343920",
    "status": "1",
    "code": "111116"
}

文档2:

{
    "id": "12343921",
    "status": "8",
    "code": "111117"
}

文档3:[与其他文档不同]

{
    "id": "active",
    "Part": [
        {
            "Name": "ABC",
            "Status": [
                "1",
                "2",
                "3"
            ]
        },
        {
            "Name": "DEF",
            "Status": [
                "6",
                "2",
                "8"
            ]
        }
    ],
}

我有一个存储过程,其中API带有3个参数,

  • id
  • 代码
  • 名称

我需要从文档3中找到相应的名称[来自API]的状态,然后需要在其他文档中应用IN子句以找到匹配的响应。

我尝试了以下几个查询。

我试图从文档3 获取状态字符串字符串:

SELECT Value t.Status
from f
JOIN t in f.Part
where t.Name=@Name

此查询在SQL编辑器中有效[如果我将@Name替换为ABC,但在存储过程中执行时则不显示文档。

其他代码

SELECT n.id,n.code,n.Status
FROM order n
where n.Code=@Code
and n.id=@id and n.Status IN (
 SELECT ARRAY(
  SELECT Part.Status
  FROM Part
  in order.Part
  WHERE Part.Name=@Name)
 FROM orders WHERE orders.id='active')

在SELECT语句附近显示错误

我期望的结果如下所示,与API中的参数匹配。

{
    "id": "12343920",
    "status": "1",
    "code": "111116"
}

1 个答案:

答案 0 :(得分:0)

根据此case,cosmos db目前尚不支持子查询,因此它在SELECT语句附近显示错误。

为达到您的要求,我建议您使用双SQL查询。

第一个选择状态数组过滤条件的sql。

SELECT value t.Status from f JOIN t in f.Part where t.Name= @Name

第二条SQL将状态与过滤条件匹配。

SELECT f.id,f.code,f.status from f where IS_DEFINED (f.Part) = false 
and ARRAY_CONTAINS(@STATUS,f.status,false)