按DocumentDB中的字段分组

时间:2015-10-27 16:19:33

标签: c# linq azure azure-cosmosdb

是否有可能以某种方式对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();

2 个答案:

答案 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。但是请注意,这不是最佳解决方案,仅应在您确定结果集很小的情况下使用。