查询Mongoid / rails 3中的嵌入对象(“低于”,Min运算符和排序)
我正在使用带有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
我想得到自给定日期以来最低价格低于给定价格p的股票,然后能够对每种股票的价格进行排序。
但看起来Mongodb不允许这样做。 因为这不起作用:
@stocks = Stock.Where(:prices.value.lt => p)
此外,似乎mongoDB无法对嵌入对象进行排序。
那么,有没有替代方案来完成这项任务?
也许我应该将所有内容放在一个集合中,以便我可以轻松运行以下查询:
@stocks = Stock.Where(:prices.lt => p)
但我真的想在我的查询之后得到按股票名称分组的结果(例如,具有一系列有序价格的不同股票)。 我听说过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
谢谢你的帮助。
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)
希望这可以帮助。
我遇到过类似的问题…这就是我的建议:
scope :price_min, lambda { |price_min| price_min.nil? ? {} : where("price.value" => { '$lte' => price_min.to_f }) }
将此范围放在父模型中。 这将使您能够进行如下查询:
Stock.price_min(1000).count
请注意,我的范围仅在您实际插入一些数据时才有效。 如果您使用Mongoid构建复杂查询,这非常方便。
祝好运!
最好的,鲁伊
MongoDB允许查询嵌入文档, http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-ValueinanEmbeddedObject
你缺少的是Price模型的范围,如下所示:
scope :greater_than, lambda {|value| { :where => {:value.gt => value} } }
这将允许您传递任何您想要的值并返回一个价格大于您传入的价格的Mongoid价格集合。它将是一个未分类的集合,因此您必须在Ruby中对其进行排序。
prices.sort {|a,b| a.value <=> b.value}.each {|price| puts price.value}
Mongoid确实有一个map_reduce方法,你传递两个包含Javascript函数的字符串变量来执行map / reduce,这可能是你做你需要的最好的方法,但上面的代码现在可以工作了。