是否有可能以某种方式对DocumentDB,存储过程中的字段进行分组?
我们说我有以下收藏品:
[
{
name: "Item A",
priority: 1
},
{
name: "Item B",
priority: 2
},
{
name: "Item C",
priority: 2
},
{
name: "Item D",
priority: 1
}
]
我想获得最高优先级组中的所有项目(在这种情况下优先级为2)。我不知道最高优先级的价值。即:
[
{
name: "Item B",
priority: 2
},
{
name: "Item C",
priority: 2
}
]
使用一些粗略的LINQ,它看起来像这样:
var highestPriority =
collection
.GroupBy(x => x.Priority)
.OrderByDescending(x => x.Key)
.First();
答案 0 :(得分:4)
DocumentDB目前不支持GROUP BY或任何其他聚合。这是第二个要求最多的功能,在DocumentDB UserVoice上列为“审核中”。
同时,documentdb-lumenize是作为存储过程编写的DocumentDB的聚合库。您将cube.string
作为存储过程加载,然后使用聚合配置调用它。这个例子有点矫枉过正,但它完全有能力做你在这里问的问题。如果将其传递给存储过程:
{cubeConfig: {groupBy: "name", field: "priority", f: "max"}}
应该做你想做的事。
注意,Lumenize可以做很多事情,包括简单的分组与其他功能(总和,计数,分钟,最大值,中位数,p75等),数据透视表,以及一直到复杂的n-每个单元具有多个度量的维度超立方体。
我从来没有尝试过从.NET加载cube.string,因为我们在node.js上,但它是以字符串形式发送而不是javascript,因此您可以轻松加载并发送它。
或者,您可以编写存储过程来执行此简单聚合。
答案 1 :(得分:0)
GroupBy在DocumentDB中仍然不受支持,最佳方法已在上面(使用存储过程)进行了描述,或者如所述UserVoice item中所述,使用Spark连接器。但是,如果要分组的集合相对较小,则还有另一种解决方案:
无需从集合中进行分组即可获取所有结果,并在内存中进行分组。
因此而不是:
cpanm File::Rename
您使用:
var highestPriority =
collection
.GroupBy(x => x.Priority)
.OrderByDescending(x => x.Key)
.First();
.AsEnumerable()从documentDB获取结果,然后在内存中完成groupBy。但是请注意,这不是最佳解决方案,仅应在您确定结果集很小的情况下使用。