Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 使用Mongoid按日期分组的最佳方式_Ruby_Mongodb_Nosql - Fatal编程技术网

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

Ruby 使用Mongoid按日期分组的最佳方式,ruby,mongodb,nosql,Ruby,Mongodb,Nosql,我正在尝试使用不同的格式(日、月、年)按日期进行查询分组,我知道在典型的SQL数据库上这是一个简单的查询 您可以在此链接上看到代码: 我知道我能跑: > Patient.group_by('created_at', 'day') => [{"_id":"11/10/2013","value":{"count":3.0}}] 在我看来,所有这些用于创建简单群组的代码都很奇怪。我错过了什么重要的事情吗 PD:我知道方法self.map和一些插值不是最好的方法,但我知道我关心Mongo

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

您可以在此链接上看到代码:

我知道我能跑:

> Patient.group_by('created_at', 'day')
=> [{"_id":"11/10/2013","value":{"count":3.0}}] 
在我看来,所有这些用于创建简单群组的代码都很奇怪。我错过了什么重要的事情吗


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

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

app/model/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, op| [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
测试/单元/患者测试.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", "created_at" => Date.new(2012, 10, 31).mongoize},
        {"name" => "Mary", "created_at" => Date.new(2012, 10, 31).mongoize},
        {"name" => "Mark", "created_at" => Date.new(2012, 12, 12).mongoize},
        {"name" => "Alex", "created_at" => Date.new(2013, 11, 10).mongoize},
        {"name" => "Andy", "created_at" => Date.new(2013, 10, 31).mongoize},
        {"name" => "Toni", "created_at" => Date.new(2013, 10, 31).mongoize},
        {"name" => "Cori", "created_at" => Date.new(2013, 11, 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

看起来您的代码与这个答案类似@earlonrails是的,当然,但这意味着这是一个好的解决方案?我之所以在乎,是因为我看到我(或你的链接)的代码非常奇怪。在这个查询中包含条件的最佳方式是什么?它工作正常,但我需要限制为一个特定的:post_id。如何做到这一点?只需在管道的开头添加一个$match阶段,请参阅Awesome。首先,请回答我在测试中看到的问题。
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, "month"=>10}, "count"=>2},
 {"_id"=>{"year"=>2013, "month"=>11}, "count"=>2},
 {"_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