在azure cosmos db中有条款吗?如何使用它?

时间:2017-09-21 13:32:41

标签: javascript azure azure-cosmosdb

我试图编写一个从所有文档中查找MAX值的查询。该场景就像我有100个学生文档,其中学生姓名,卷号以及该主题数组及其各自标记内的测试数组。所以,我从所有文件中获得了主题物理学中最高的分数。但是我没有得到学生卷数。那是我试图找出来的。

TestDoc is:

    Student[
    StudenName:"A",
    StudentRollNo :1,
    id:"1",
    StudentAdd:"---",
    Test1:[
    {
      SubName:"S1",
      Marks:20
    },
    {
      SubName:"S2",
      Marks:30
    },
    ...

    ],
    Test2:
    [
     Same as above
    ],         
    ],

    [
    STUDENT2
    ] ,

and so on

我使用的查询是: 从test.marks中的c.Test1 join s中的c join test中选择MAX(s.Marks)

1 个答案:

答案 0 :(得分:1)

根据您的描述,您希望在azure cosmosdb查询中实现GROUP BY之类的函数。

根据我的经验,SQL中的azure cosmosdb aggregation功能仅限于COUNT, SUM, MIN, MAX, AVG个功能。 azure cosmosdb现在不支持GROUP BY或其他聚合功能。

但是,stored proceduresUDF可用于实现您的汇总要求。

您可以根据DocumentDb存储过程引用一个很棒的包documentdb-lumenize

对于您帖子中的第一个场景,我在我的azure cosmosdb帐户中创建了两个学生文档。

[
  {
    "id": "1",
    "StudenName": "A",
    "StudentRollNo": 1,
    "Test": [
      {
        "SubName": "S1",
        "Marks": 20
      },
      {
        "SubName": "S2",
        "Marks": 30
      }
    ],
  },
  {
    "id": "2",
    "StudenName": "B",
    "StudentRollNo": 2,
    "Test": [
      {
        "SubName": "S1",
        "Marks": 10
      },
      {
        "SubName": "S2",
        "Marks": 40
      }
    ],
  }
]

然后我将下面的SQL搜索的结果集放到上面提到的documentdb-lumenize以获得max S2标记。

SELECT  c.StudentRollNo,test1.Marks as mark FROM c
join test1 in  c.Test
where test1.SubName='S2'

enter image description here

对于评论中的第二个场景,我删除了上面SQL的where clause

SELECT  c.StudentRollNo,test1.Marks as mark FROM c
join test1 in  c.Test

resultset喜欢:

enter image description here

这仅适用于one测试。如果您想查询multiple测试,可以使用stored procedure

你也可以参考下面的SO线程:

1。Azure DocumentDB - Group By Aggregates

2。Grouping by a field in DocumentDB