我试图编写一个查询,从所有文档中查找最大值。该场景类似于我有 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
我使用的查询是: select MAX(s.Marks) from c join test in c.Test1 join s in test.marks
最佳答案
根据您的描述,您希望在 azure cosmosdb 查询中实现类似 GROUP BY
的功能。
根据我的经验,SQL 中的 azure cosmosdb 聚合
功能仅限于 COUNT、SUM、MIN、MAX、AVG
函数。 azure cosmosdb 不支持 GROUP BY
或其他聚合功能现在。
但是,可以使用存储过程
或UDF
来实现您的聚合需求。
你可以引用一个很棒的包documentdb-lumenize基于DocumentDb存储过程。
对于您帖子中的第一个场景,我在我的 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'
对于您评论中的第二种情况,我删除了上面 SQL 的 where 子句
。
SELECT c.StudentRollNo,test1.Marks as mark FROM c
join test1 in c.Test
和结果集
如:
这仅适用于一个
测试。如果您想查询多个
测试,您可以使用存储过程
。
您还可以引用下面的SO线程:
关于javascript - azure cosmos db 中是否有having 子句?如何使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46345374/