【问题标题】:How can I filter results of map-reduce in Mongoid如何在 Mongoid 中过滤 map-reduce 的结果
【发布时间】:2023-03-23 13:07:01
【问题描述】:

有没有办法在 Mongoid 中过滤 map-reduce 操作的结果?我发现了一个可以在 MongoDB 上执行的“查询”函数,但在 Mongoid 中似乎没有映射。

我想获取该值大于 10 的所有用户的活动计数:

Activity.map_reduce(%{
    emit(this.user_id, 1);
  }, %{
    function(key, values) {
      return Array.sum(values);
    }
  }).out(inline: true).query(:'value.gt' => 10)

【问题讨论】:

  • 查询在 map 和 reduce 运行之前过滤文档 - 这就是你想要的吗?
  • 不,之后。我想过滤减少后的结果——就像我试图用上面的“查询”调用来说明的那样
  • 您是否有理由不只使用聚合框架 - 与 map-reduce 相比,它更简单、更快。你用的是哪个版本的 Mongoid?

标签: mongodb mongoid


【解决方案1】:

Mongoid 支持聚合框架(从 3.x 开始),这使得这变得简单:

group =  { "$group" =>
             { "_id" => "$user_id", "count" => { "$sum" => 1 } } 
}

match = {"$match" => 
           { "count"    => { "$gt" => 10} }
}

Activity.aggregate([group,match])

【讨论】:

  • 谢谢!事实上,没有充分的理由不这样做。所以,我没有。我修复了您的代码以使用 $project 而不是 $unwind。
  • 好的。我的代码中没有看到 $unwind ,但我确信你所做的任何事情都适合你的用例,我只是想展示最小的工作示例:)
  • 现在我看到了您的“建议”编辑 - 您不需要 $project - 聚合框架足够聪明,可以只通过管道传递它需要的字段。至于使用 $sort 和 $limit - 我希望可以“根据需要”添加它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多