我试图通过特定嵌入文档的值来排序查询结果,但即使使用了$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