如何根据 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 操作来获取每个组的计数。
我没有在你的数据集上测试查询。如果您遇到问题,请发表评论。
编辑:
如果要添加计数字段并保留原始文档,则需要使用map
和reduce
。在你的情况下,它应该是这样的:
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'))
正在将此数据集导入为 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 操作来获取每个组的计数。
我没有在你的数据集上测试查询。如果您遇到问题,请发表评论。
编辑:
如果要添加计数字段并保留原始文档,则需要使用map
和reduce
。在你的情况下,它应该是这样的:
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'))