Mongoid / MongoDB:按嵌入文档的值排序查询?

时间:2015-01-27 22:19:51

标签: mongodb mongoid

我试图通过特定嵌入文档的值来排序查询结果,但即使使用了$elemMatch运算符,看起来似乎是一组有效的选项,我的结果又回来了自然秩序。

我的模型由卡片embeds_many :card_attributes组成,卡片又引用特定的CardAttributeField并包含整数value。我希望能够按该值订购一系列卡片。

我能够隔离一组卡片,这些卡片的CardAttribute引用了特定的CardAttributeField,如下所示:

cards = Card.where(:card_attributes.elem_match => {
    :card_attribute_field_id => card_attribute_field.id
})

如果我知道card_attributes的设置顺序,我可以使用MongoDB array notation,如下所示:

cards.order_by(['card_attributes.0.value', :asc])

这确实可以在测试场景中实现我的预期效果,但它不会在现实世界中发挥作用。

经过多次搞乱后,我发现了一种语法,我认为这会让我match a field without using array notation

cards.asc(:'card_attributes.value'.elem_match => {
    :card_attribute_field_id => card_attribute_field.id
})

这会在生成的Mongoid :: Criteria上生成一组options,如下所示:

  {:sort=>{"{#<Origin::Key:0x2b897548 @expanded=nil, @operator=\"$elemMatch\", @name=:\"card_attributes.value\", @strategy=:__override__, @block=nil>=>{:card_attribute_field_id=>\"54c6c6fe2617f55611000068\"}}"=>1}}

然而,无论是否致电asc()desc(),结果都会以相同的顺序返回。

有什么方法可以做我以后做的事吗?我采取了错误的方法,还是我的实施有误?感谢。

简化,我的模型是:

class Card
  include Mongoid::Document

  # various other fields

  has_many :card_attribute_fields
  embeds_many :card_attributes do
    def for_attribute_field card_attribute_field
      where(:card_attribute_field_id => card_attribute_field.id)
    end
  end
end

class CardAttributeField
  include Mongoid::Document

  belongs_to :card

  field :name, type: String
  field :default_value, type: String
  field :description, type: String
end

class CardAttribute
  include Mongoid::Document

  embedded_in :card

  field :card_attribute_field_id, type: Moped::BSON::ObjectId
  field :value, type: Integer
end

0 个答案:

没有答案