2013-11-08 7 views
0

У меня есть простой набор данных в MongoDB (версия 2.2.2):

{ 
    "_id": "527d60865593622ba17643e6", 
    "siteid": "100", 
    "date": 1383940800, 
    "visits": 1 
}, 
{ 
    "_id": "527d60865593622ba17643e7", 
    "siteid": "200", 
    "date": 1383940801, 
    "visits": 1 
}, 
{ 
    "_id": "527d60865593622ba17643e8", 
    "siteid": "200", 
    "date": 1383940802, 
    "visits": 1 
} 

У меня есть Mongoid (версия 3.0.1) коллекция, где я пытаюсь использовать совокупный метод:

query = { 
    "$project" => { _id: 0 }, 
    "$match" => {"$and" => [{:date=>{"$gte"=>1383940800}}, {:date=>{"$lt"=>1384027200}}]}, 
    "$group" => {"_id" => "$siteid", "visits" => {"$sum" => "$visits"}}, 
    "$project" => { "siteid" => "$_id" } 
} 
result = @object.collection.aggregate(query) 

в результате, что я вернусь в следующем:

[{"_id"=>200, "visits"=>2}, {"_id"=>100, "visits"=>1}] 

W шляпа Я хотел бы результат будет таков:

[{"siteid"=>200, "visits"=>2}, {"siteid"=>100, "visits"=>1}] 

Я думал, что последняя операция $ проект будет делать это для меня, но это, кажется, полностью игнорируется. Какие-либо предложения?

ответ

0

Аргумент метода aggregate - это конвейер, который представляет собой массив хэшей, где каждый хеш является этапом. Ваш пример запроса - хэш со значениями, которые являются хешами; слишком плохо, что он хорошо читается, но это скрывает неправильное использование. К сожалению, Moped каким-то образом допускает это неправильное использование, хотя оболочка mongo его ловит и возвращает сообщение об ошибке сервера «Исключение: объект спецификации этапа конвейера должен содержать ровно одно поле». Надеюсь, вам понравится следующее, я думаю, что это то, что вы хотите.

тест/блок/visit_test.rb

require 'test_helper' 
require 'json' 

class VisitTest < ActiveSupport::TestCase 
    def setup 
    Visit.delete_all 
    puts 
    end 
    test "0. mongoid version" do 
    puts "Mongoid::VERSION:#{Mongoid::VERSION}\nMoped::VERSION:#{Moped::VERSION}" 
    end 
    test "project after group" do 
    data = JSON.parse(<<-EOD 
     [ 
     {"_id": "527d60865593622ba17643e6", "siteid": "100", "date": 1383940800, "visits": 1}, 
     {"_id": "527d60865593622ba17643e7", "siteid": "200", "date": 1383940801, "visits": 1}, 
     {"_id": "527d60865593622ba17643e8", "siteid": "200", "date": 1383940802, "visits": 1} 
     ] 
    EOD 
    ) 
    Visit.create(data) 
    assert_equal 3, Visit.count 
    pipeline = [ 
     {"$match" => {"$and" => [{:date => {"$gte" => 1383940800}}, {:date => {"$lt" => 1384027200}}]}}, 
     {"$group" => {"_id" => "$siteid", "visits" => {"$sum" => "$visits"}}}, 
     {"$project" => {"_id" => 0, "siteid" => "$_id", "visits" => 1}} 
    ] 
    p Visit.collection.aggregate(pipeline) 
    end 
end 

тест рейк

Run options: 

# Running tests: 

[1/2] VisitTest#test_0._mongoid_version 
Mongoid::VERSION:3.1.5 
Moped::VERSION:1.5.1 
[2/2] VisitTest#test_project_after_group 
[{"visits"=>2, "siteid"=>"200"}, {"visits"=>1, "siteid"=>"100"}] 
Finished tests in 0.038172s, 52.3944 tests/s, 26.1972 assertions/s. 
2 tests, 1 assertions, 0 failures, 0 errors, 0 skips 

 Смежные вопросы

  • Нет связанных вопросов^_^