微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ruby – 使用Mongoid按日期分组的最佳方式

我正在尝试使用不同的格式(日,月,年)按日期进行查询分组,我知道这对于典型的sql数据库来说是一个简单的查询.

您可以在此链接上看到代码https://gist.github.com/jrdi/b3f824fa4e7531c43bfd

知道我可以跑:

> Patient.group_by('created_at','day')
=> [{"_id":"11/10/2013","value":{"count":3.0}}]

在我看来,所有这些代码组成一个简单的组是非常奇怪的.我错过了重要的事吗?

PD:我知道方法self.map和一些插值不是最好的方法,但知道我关心Mongo的东西.

解决方法

这是一个使用聚合框架按日期分组的答案.我希望你喜欢它.

应用程序/模型/ patient.rb

class Patient
  include Mongoid::Document
  field :name,type: String

  def self.group_by(field,format = 'day')
    key_op = [['year','$year'],['month','$month'],['day','$dayOfMonth']]
    key_op = key_op.take(1 + key_op.find_index { |key,op| format == key })
    project_date_fields = Hash[*key_op.collect { |key,op| [key,{op => "$#{field}"}] }.flatten]
    group_id_fields = Hash[*key_op.collect { |key,"$#{key}"] }.flatten]
    pipeline = [
        {"$project" => {"name" => 1,field => 1}.merge(project_date_fields)},{"$group" => {"_id" => group_id_fields,"count" => {"$sum" => 1}}},{"$sort" => {"count" => -1}}
    ]
    collection.aggregate(pipeline)
  end
end

测试/单元/ patient_test.rb

require 'test_helper'
require 'pp'

class PatientTest < ActiveSupport::TestCase
  def setup
    Patient.delete_all
  end

  test "group by date" do
    [
        {"name" => "John","created_at" => Date.new(2012,10,10).mongoize},{"name" => "Jane",31).mongoize},{"name" => "Mary",{"name" => "Mark",12,12).mongoize},{"name" => "Alex","created_at" => Date.new(2013,11,{"name" => "Andy",{"name" => "Toni",{"name" => "Cori",10).mongoize}
    ].each do |patient|
      Patient.create(patient)
    end
    puts "\nMongoid::VERSION:#{Mongoid::VERSION}\nMoped::VERSION:#{Moped::VERSION}"
    pp Patient.group_by('created_at','month')
  end
end

$rake test

Run options:

# Running tests:

[1/1] PatientTest#test_group_by_date
Mongoid::VERSION:3.1.5
Moped::VERSION:1.5.1
[{"_id"=>{"year"=>2012,"month"=>10},"count"=>3},{"_id"=>{"year"=>2013,"count"=>2},"month"=>11},{"_id"=>{"year"=>2012,"month"=>12},"count"=>1}]
Finished tests in 0.042561s,23.4957 tests/s,0.0000 assertions/s.
1 tests,0 assertions,0 failures,0 errors,0 skips

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐