Nosql 是否可以使用reduce函数返回多个结果?

Nosql 是否可以使用reduce函数返回多个结果?,nosql,rethinkdb,rethinkdb-ruby,Nosql,Rethinkdb,Rethinkdb Ruby,使用以下模式(定义如下)。我可以使用map reduce聚合所有天的delivered_count字段(这是活动文档中的一个嵌入数组) 下面的代码通过字段asia\u regions解析,输出字段clicked\u count=>30的值(所有数据的组合值) 是否可以针对多个区域运行上述代码?这样我可以运行一个查询,返回多个和。我试图实现的输出类似于下面的伪结果 [{ asia_region: {clicked_count: 30}}, {america_region: {clicked_cou

使用以下模式(定义如下)。我可以使用map reduce聚合所有天的delivered_count字段(这是活动文档中的一个嵌入数组)

下面的代码通过字段
asia\u regions
解析,输出字段
clicked\u count
=>30的值(所有数据的组合值)

是否可以针对多个区域运行上述代码?这样我可以运行一个查询,返回多个和。我试图实现的输出类似于下面的伪结果

[{ asia_region: {clicked_count: 30}}, {america_region: {clicked_count: 30} }]

我对你发布的代码有点困惑。为什么所有东西都在
过滤器中?要输出您想要的内容,请执行以下操作:

regions = [:pacific_region, :america_region, ...]
reg_clicks = r.table(:daily_stat_campaigns).concat_map { |row|
                 row[:dates]
                 .coerce_to("ARRAY")
                 .map{ |date| date[0] }
                 .pluck(regions)
                 .coerce_to("ARRAY")
              }
您现在可以运行reg_单击,它应该如下所示:

$ reg_clicks.run()
[[:asia_region, {clicked_count: 30}], [:etc_region, {clicked_count: 30}], ...]
现在,我们需要做最后一个转换来聚合它:

$ aggregate = reg_clicks.map{ |reg|
                  {reg: reg[0], clicked_count: reg[0][:clicked_count]}
              }
              .group_by(:reg, r.sum(:clicked_count))
这将为您提供如下输出:

[{group: :asia_region, reduction: 150} ...]
如果您也希望它看起来与您想要的完全一样,则可以应用最终转换:

aggregate.map{ |row|
    [row[:group], row[:reduction]]
}
.coerce_to("OBJECT")

如果将数据规范化一点,这些查询肯定会更好。将内容拆分为另外两个名为:dates和:region_clicks的表,看起来是这样的:

#dates
{
    id: 0
    campaign_id: 1
    date: '20130927'
    delivered: 1,
    failed: 1,
    queued: 1,
    clicked: 1,
    males_count: 1
}

#region_clicks
{
    region: "asia_region",
    click_count: 30,
    date_id: 0
}
那么您的查询将非常简单:

r.table(:region_clicks).group_by(:region, r.sum(:click_count)).run()
这似乎有效:

require 'awesome_print' # For better readability on output

regions = [:pacific_region, :america_region]
reg_clicks = $rethinkdb.table(:daily_stat_campaigns).filter { |daily_stat_campaign| daily_stat_campaign[:campaign_id].eq 1 }[0][:dates].do { |doc|
  doc.keys.concat_map { |key|
    doc
    .get_field(key)
    .pluck(regions)
    .coerce_to("ARRAY")
  }
}
ap reg_clicks.run
将输出如下内容:
[[“美国地区”、{“点击次数”=>10}]、“太平洋地区”、{“点击次数”=>10}]、“美国地区”、{“点击次数”=>10}]、“太平洋地区”、{“点击次数”=>10}]、“美国地区”、{“点击次数”=>10}]、“太平洋地区”、{“点击次数”=>10}]

aggregate = reg_clicks.map { |reg|
  { reg: reg[0], clicked_count: reg[1][:clicked_count] }
}
ap aggregate.run
将输出:
[{“reg”=>“美国地区”、“点击次数”=>10}、{“reg”=>“太平洋地区”、“点击次数”=>10}、{“reg”=>“美国地区”、“点击次数”=>10}、{“reg”=>“太平洋地区”、“点击次数”=>10}、{“reg”=>“美国地区”、“点击次数”=>10}、{“reg”=>太平洋地区”、“点击次数”=>10}

ap aggregate.group_by(:reg, $rethinkdb_rql.sum(:clicked_count)).run

输出:
[{“reduction”=>30,“group”=>{“reg”=>“america_region”},{“reduction”=>30,“group”=>{“reg”=>“pacific_region”}]

嗨,乔,我相信马克正在使用
过滤器
,这样他就可以聚合一次战役的天数。第二,他想要嵌入,而不是引用。除非您认为嵌入的日期数组可能太大,并对性能造成某种影响。这里的目的只是每次活动的存储时间不超过90天。你的想法是什么?乔,你建议的密码。返回以下错误:
referencedb::RqlRuntimeError:无法对非对象非序列“20130926”执行Pull操作。
不知道使用
grouped\u mapped\u reduce是否可以更简单地执行上述操作
正是我想要的。干杯
aggregate = reg_clicks.map { |reg|
  { reg: reg[0], clicked_count: reg[1][:clicked_count] }
}
ap aggregate.run
ap aggregate.group_by(:reg, $rethinkdb_rql.sum(:clicked_count)).run