代码之家  ›  专栏  ›  技术社区  ›  user2981411

CosmosDB获取数组中某个字段的总和

  •  0
  • user2981411  · 技术社区  · 3 月前

    我们在Azure CosmosDB中有一个对象,如下所示:

    {
    "id": "2hgxw",
    "invoices": [
            {
                "key": "123",
                "value": 1200
            }
        ],
    
    }
    

    我们想创建一个过滤器,这样我们就可以选择有或没有平衡的对象,但我们的代码会出错。

    我们正在尝试的是:

    SELECT c.id FROM pros c WHERE c.id='somevalue' AND SUM(c.invoices.value)<>0
    

    感谢。

    1 回复  |  直到 3 月前
        1
  •  1
  •   David Makogon    3 月前

    几个问题:

    • 首先,您引用的属性与关键字同名( value )-这将抛出一个错误。这需要采用以下格式 c["value"] (或重命名该属性)
    • 第二:你不能像现在这样将数组值传递给 sum() - sum() 跨文档处理单个属性。相反,你必须进行自我连接。这个例子总结了所有 价值 数组的属性,作为总计(不进行任何过滤-仅显示如何使用数组数据和聚合):
    SELECT sum(i["value"]) as total
    FROM c
    join i in c.invoices
    

    为了对总值进行过滤,您必须对内部连接和别名进行更精细的处理。这样的方法是可行的(我添加发票计数只是为了好玩),假设数组中有两个项目:一个有值 1200 一个有价值 1 :

    SELECT invoiceData.invoiceCount, invoiceData.invoiceTotal
    FROM c
    JOIN
       (SELECT COUNT(1) as invoiceCount,
        SUM(i["value"]) as invoiceTotal
        FROM i in c.invoices)
       AS invoiceData
    where
       invoiceData.invoiceTotal <> 0
    

    这将产生:

    [
        {
            "invoiceCount": 2,
            "invoiceTotal": 1201
        }
    ]