查询Mongoid/rails 3中的嵌入对象("低于",Min运算符和排序)

mat*_*rip 16 mapreduce ruby-on-rails mongodb mongoid

我正在使用带有mongoid的rails 3.我有一个股票的集合与嵌入的价格集合:

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
Run Code Online (Sandbox Code Playgroud)

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

但看起来Mongodb不允许这样做.因为这不起作用:

@stocks = Stock.Where(:prices.value.lt => p)
Run Code Online (Sandbox Code Playgroud)

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

那么,有没有替代方案来完成这项任务?

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

@stocks = Stock.Where(:prices.lt => p)
Run Code Online (Sandbox Code Playgroud)

但我真的希望在我的查询后以股票名称对结果进行分组(例如,具有一系列有序价格的不同股票).我听说过map/reduce with group function但我不确定如何正确使用Mongoid.

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

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

SELECT name, code, min(price) from Stock WHERE price<p GROUP BY name, code
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.

Ric*_*ick 21

MongoDB/Mongoid允许你这样做.您的示例将起作用,语法不正确.

@stocks = Stock.Where(:prices.value.lt => p) #does not work

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

并且,它仍然是可链接的,因此您也可以按名称订购:

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

希望这可以帮助.