Cosmos 查询查找唯一计数

问题描述 投票:0回答:1

我在 Cosmos 中有以下文档,我想在其中获取 stockNumber 的不同计数以及状态为

Waiting-Reconciliation
的关联 lineItems。

数据:

Doc-1:

{
    "stockNumber": "123",
    "lineItems": [
        {
            "itemState": "Reconciled"
        },
        {
           "itemState": "Waiting-Reconciliation"
        },
        {
            "itemState": "Waiting-Reconciliation"
        }
    ]
}

Doc-2:

{
    "stockNumber": "234",
    "lineItems": [
        {
            "itemState": "Waiting-Reconciliation"
        }
    ]
}

Doc-3:

{
    "stockNumber": "345",
    "lineItems": [
        {
            "itemState": "Reconciled"
        },
        {
            "itemState": "Reconciled"
        }
    ]
}

所需输出: 这里

"123"
"234"
具有带有
Waiting-Reconciliation
的 itemState,因此它们都是合格的。

[
    {
        "stockCount": 2,
        "lineItemCount": 3
    }
]

询问:

当我运行这个时,

SELECT COUNT(DISTINCT c.stockNumber) AS stockCount, 
COUNT(c.lineItems) AS lineItemCount 
FROM c JOIN l IN c.lineItems 
WHERE l.itemState = 'Waiting-Reconciliation'

然后我收到此错误。

{"code":"BadRequest","message":"One of the input values is invalid.\r\nActivityId: 1b7d21f5-2d83-4e9a-834c-26729f5bad1d, Windows/10.0.20348 cosmos-netstandard-sdk/3.18.0"}

现在,如果我只删除

DISTINCT
那么两者都会返回 3,这是我不想要的。我在这里缺少什么?

SELECT 
count(c.stockNumber) AS stockCount, 
count(c.lineItems) AS lineItemCount 
FROM c JOIN l IN c.lineItems 
WHERE l.itemState = 'Waiting-Reconciliation'

注: 这运行成功,但是当我尝试获取计数时,它会抛出上述错误。

SELECT
  DISTINCT c.stockNumber AS stockCount,
  c.lineItems AS lineItemCount
FROM c JOIN l 
IN c.lineItems 
WHERE l.itemState = 'Waiting-Reconciliation'

基本上,我想将这两个查询合并为一个。或者至少,结合他们的结果。

SELECT COUNT(c) AS stockCount 
FROM c WHERE ARRAY_LENGTH(c.lineItems) > 0 
AND EXISTS (SELECT VALUE l FROM l IN c.lineItems WHERE STRINGEQUALS(l.itemState, 'Waiting-Reconciliation', true))

结果:

[
    {
        "stockCount": 2
    }
]
SELECT
  COUNT(c) AS lineItemCount
FROM c
  JOIN l IN c.lineItems 
WHERE l.itemState = 'Waiting-Reconciliation'

结果:

[
    {
        "lineItemCount": 3
    }
]
azure-cosmosdb
1个回答
0
投票

尝试使用问题中给出的上述查询会导致计数为

3
,因为在查询中它分别计算
stockNumber
lineItems
的计数。

由于使用 Cosmos 查询完成了许多跟踪并找到了一种方法来获得预期结果,您可以使用 UDF 在 Cosmos 中找到唯一计数,并在查询时调用它。

UDF 用于计算

stockCount
: 在这个函数中,它检查
doc
是否包含
lineItems
,如果包含则检查当前
itemState
对象的
lineItem
属性是否等于
"Waiting-Reconciliation"
,如果找到则返回1 .

function stockCountUDF(doc) {
    if (!doc || !doc.lineItems) {
        return 0;
    }
    for (var i = 0; i < doc.lineItems.length; i++) {
        if (doc.lineItems[i].itemState === "Waiting-Reconciliation") {
            return 1;
        }
    }
    return 0;
}

UDF 用于计算

lineItemCount
: 在这个函数中,它检查
lineItems
是否存在,如果存在则检查当前
itemState
对象的
lineItem
属性是否等于
"Waiting-Reconciliation"
如果找到则返回
count

function lineItemCountUDF(lineItems) {
    if (!lineItems) {
        return 0;
    }
    var count = 0;
    for (var i = 0; i < lineItems.length; i++) {
        if (lineItems[i].itemState === "Waiting-Reconciliation") {
            count++;
        }
    }
    return count;
}

我尝试过的查询: 在下面的查询中,它总结了

count
返回的所有
udf
并在输出中打印,如下所示。

SELECT
    SUM(udf.stockCountUDF(c)) AS stockCount,
    SUM(udf.lineItemCountUDF(c.lineItems)) AS lineItemCount
FROM c

输出:

[
    {
        "stockCount": 2,
        "lineItemCount": 3
    }
]
© www.soinside.com 2019 - 2024. All rights reserved.