我正在尝试使用不同的格式(日,月,年)按日期进行查询分组,我知道这对于典型的sql数据库来说是一个简单的查询.
您可以在此链接上看到代码:https://gist.github.com/jrdi/b3f824fa4e7531c43bfd
知道我可以跑:
> Patient.group_by('created_at','day') => [{"_id":"11/10/2013","value":{"count":3.0}}]
解决方法
这是一个使用聚合框架按日期分组的答案.我希望你喜欢它.
应用程序/模型/ 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 举报,一经查实,本站将立刻删除。