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)
希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
12581 次 |
| 最近记录: |