2013-03-31 3 views
0

У меня есть модель с этой схемой:Сортировка по вложенному атрибуту, Mongoid

class Treatment 
    include Mongoid::Document 

    field :value, type: Money # money-rails gem 
end 

это поле значение получить сохраненные в БД, как value: {"cents"=>313, "currency_iso"=>"EUR"}

Я хотел бы найти все процедуры и отсортировать их по cents стоимость.

Сейчас это как я это делаю:

Treatment.collection.find().sort({value: { :cents => 1 }})

Это используется драйвер Мопед. Как я могу это сделать, используя простой Mongoid?

Редактировать1.

[6] pry(main)> Treatment.all.only(:value).asc('value.cents').entries 
    => [#<Treatment _id: 515854c2a1d24ccb1f000005, value: {"cents"=>2849, "currency_iso"=>"EUR"}>, 
    #<Treatment _id: 515854c2a1d24ccb1f000006, value: {"cents"=>313, "currency_iso"=>"EUR"}>, 
    #<Treatment _id: 515854c2a1d24ccb1f00000f, value: {"cents"=>1214, "currency_iso"=>"EUR"}>, 
    #<Treatment _id: 515854c2a1d24ccb1f000010, value: {"cents"=>1795, "currency_iso"=>"EUR"}>, 
    #<Treatment _id: 515854c2a1d24ccb1f000011, value: {"cents"=>105, "currency_iso"=>"EUR"}>, 
    #<Treatment _id: 515854c2a1d24ccb1f000012, value: {"cents"=>2547, "currency_iso"=>"EUR"}> 

Редактировать2.

MongoDB: стабильная 2.4.1-x86_64 Mongoid (3.1.2)

ответ

1

Используйте точечный синтаксис:

Treatment.all.asc('value.cents') 

редактирования: Полный пример:

require 'mongoid' 
Mongoid.load!("mongoid.yml", :development) 

class Treatment 
    include Mongoid::Document 
    field :value, type: Hash 
end 

Treatment.delete_all 

15.times do 
    Treatment.create(value: {cents: rand(3000), currency_iso: "EUR" }) 
end 
p Treatment.all.only(:value).asc('value.cents').map{|t| t.value["cents"] } 
+0

Это была моя первая мысль. Но это просто не работает. Записи не упорядочены. – Nerian

+0

Оформить заказ Редактировать – Nerian

+0

Какую версию mongoid/mongodb вы используете? Я опубликовал полный пример, который работает для меня с использованием Mongoid 3.1.2 и MongoDB 2.2.0. – 2013-04-01 12:56:11

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