如何根据rethinkdb中减少数组的计数对分组进行降序排序

时间:2015-05-19 01:52:50

标签: rethinkdb

将此数据集导入为表格:

https://data.cityofnewyork.us/Housing-Development/Registration-Contacts/feu5-w2e2#revert

我使用以下查询执行聚合,然后尝试根据缩减字段按降序排序。我的意图是根据该字段的计数进行排序,或者让聚合创建一个名为count的第二个字段,并按照减少数组计数或长度的降序对分组结果进行排序。如何在rethinkdb中完成?

查询:

A=[110 503
402 110
300 900
300 402]

[~,~,D]=unique(A);
reshape(D,size(A))

2 个答案:

答案 0 :(得分:1)

I don't quite understand what you're going for, but does this do what you want? If not, what do you want to be different in the output?

r.table("contacts")
 .filter({"Type": "Agent","ContactDescription" : "CONDO"})
 .hasFields("CorporationName")
 .group("CorporationName")
 .ungroup()
 .merge(function(row){ return {count: row('reduction').count()}; })
 .orderBy(r.desc('count'))

答案 1 :(得分:0)

你快到了:

r.table("contacts").filter({"Type": "Agent","ContactDescription" : "CONDO"}).hasFields("CorporationName").group("CorporationName").count().ungroup().orderBy(r.desc('reduction'))

看到.count()?这是一个map-reduce操作,用于获取每个组的计数。

我还没有在您的数据集上测试查询。如果您遇到问题,请发表评论。

<小时/> 修改

如果您要添加计数字段并保留原始文档,则需要使用mapreduce。在你的情况下,它应该是这样的:

r.table("contacts").filter({"Type": "Agent","ContactDescription" : "CONDO"})
    .hasFields("CorporationName")
    .group("CorporationName")
    .map(r.row.merge({count:1}))
    .reduce(function(left, right){
        return {
            count: left('count').add(right('count')),
            <YOUR_OTHER_FIELDS>: left('<YOUR_OTHER_FIELDS>'),
            ...
        };
    })
    .ungroup().orderBy(r.desc(r.row('reduction')('count')))

修改

我不确定这是否可以解决问题,但值得一试:

.reduce(function(left, right){
    return left.merge({count: left('count').add(right('count'))})
})