我在 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
}
]
尝试使用问题中给出的上述查询会导致计数为
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
}
]