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

How can I descending sort a grouping based on the count of the reduction array in rethinkdb

正在将此数据集导入为 table:

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

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

查询:

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

你快到了:

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'))})
})

我不太明白你要干什么,但这是否符合你的要求?如果不是,您希望输出有何不同?

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'))