根据项目状态查询Azure Cosmos DB集合

时间:2020-01-14 11:51:35

标签: sql azure nosql azure-cosmosdb azure-cosmosdb-sqlapi

在Azure上的Azure Cosmos DB中,我有一个具有以下结构的集合:

[
  {
    "id": "1",
    "status": "wait",
    "order": {
            "orderId": "P1000",
            "orderPositionId": "1"
    }   
  },
  {
    "id": "2",
    "status": "wait",
    "order":{
            "orderId": "P1000",
            "orderPositionId": "2"
    }
  },
  {
    "id": "3",
    "status": "start",
    "order":{
            "orderId": "P1000",
            "orderPositionId": "1"
    }
  }
]

orderId和orderPositionId的组合是唯一的。

我要查询状态为“等待”的所有项目,而其中没有状态为“开始”的项目。

对于上面的示例,查询的期望结果是:

[
{
    "id": "2",
    "status": "wait",
    "order":{
            "orderId": "P1000",
            "orderPositionId": "2"
    }
  }
]

我的想法是这样做(伪代码

SELECT *FROM c
WHERE 
c.status="wait"
AND
EXISTS(SELECT * FROM c 
       WHERE c.order.orderId = c.order.orderId **(id of current item)** AND 
             c.order.orderPositionId=c.order.orderPositionId **(id of current item)** AND 
             c.status="start") = false

我知道这个想法不会这样。 我是Cosmos DB和SQL API的新手,但我无法找出有效的解决方案。感谢您提供有关如何解决此问题的提示。

谢谢,如果您需要其他信息,请告诉我。

1 个答案:

答案 0 :(得分:0)

但是我的目标是删除所有具有相应开始的等待项 项目。

因此,如果有2个文档,则:

{
    "id": "1",
    "status": "wait",
    "order": {
            "orderId": "P1000",
            "orderPositionId": "1"
    }   
  },
  {
    "id": "3",
    "status": "start",
    "order":{
            "orderId": "P1000",
            "orderPositionId": "1"
    }
  }

它们具有相同的功能:

 "order":{
            "orderId": "P1000",
            "orderPositionId": "1"
 }

然后,您需要从wait家族中删除一个wait

根据我的大量测试,我无法使用带有array_contains方法的子查询。因此,我必须使用2条sql来实现您的要求。

第一个查询所有start项的sql:

SELECT c['order'].orderId,c['order'].orderPositionId FROM c
where c.status = 'start'

您将获得数组结果:

enter image description here

然后在下面的长条sql中使用该数组:

select c.id,c.status,c['order'] 
from c
where c.status = 'wait' and not EXISTS 
(select value c from c 
where c.status = 'wait' and arraycontains(
[
    {
        "orderId": "P1000",
        "orderPositionId": "1"
    }
],{"orderId": c['order'].orderId,"orderPositionId":c['order'].orderPositionId},true))

您可以获得输出:

enter image description here