在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的新手,但我无法找出有效的解决方案。感谢您提供有关如何解决此问题的提示。
谢谢,如果您需要其他信息,请告诉我。
答案 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'
您将获得数组结果:
然后在下面的长条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))
您可以获得输出: