ruby-on-rails – 在Mongoid / rails 3中查询嵌入的对象(“低于”,最小运算符和排序)

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 在Mongoid / rails 3中查询嵌入的对象(“低于”,最小运算符和排序)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用轨道3与mongoid.
我有一个收藏的股票与嵌入收藏价格:
class Stock
  include Mongoid::Document
  field :name,:type => String
  field :code,:type => Integer
  embeds_many :prices

class Price
  include Mongoid::Document
  field :date,:type => DateTime
  field :value,:type => Float
  embedded_in :stock,:inverse_of => :prices

我想获得自给定日期以来的最低价格低于给定价格p的股票,然后能够对每个股票的价格进行排序.

但是看起来Mongodb不允许这样做.
因为这样不行:

@stocks = Stock.Where(:prices.value.lt => p)

此外,似乎mongoDB无法对嵌入的对象进行排序.

那么,为了完成这个任务,还有其他的选择吗?

也许我应该将所有内容放在一个集合中,以便我可以轻松地运行以下查询

@stocks = Stock.Where(:prices.lt => p)

但是,我真的希望在查询之后得到按股票名称分组的结果(例如,具有订单价格数组的不同股票).我已经听说过map / reduce与组功能,但我不知道如何正确使用Mongoid.

http://www.mongodb.org/display/DOCS/Aggregation

sql中的等价物将是这样的:

SELECT name,code,min(price) from Stock WHERE price<p GROUP BY name,code

谢谢你的帮助.

解决方法

MongoDB / Mongoid可以让你这样做.你的例子会奏效,语法不正确.
@stocks = Stock.Where(:prices.value.lt => p) #does not work

@stocks = Stock.where('prices.value' => {'$lt' => p}) #this should work

而且,它仍然是可链接的,所以你可以按名称排序:

@stocks = Stock.where('prices.value' => {'$lt' => p}).asc(:name)

希望这可以帮助.

猜你在找的Ruby相关文章