mongoid / origin

A Ruby DSL for building MongoDB queries
http://mongoid.org/en/origin/index.html
MIT License
62 stars 29 forks source link

elem_match with lte produces incorrect selector #40

Closed durran closed 11 years ago

durran commented 12 years ago

From mongoid/mongoid#2206

Vote.where(:"versions".elem_match => { :updated_at.lte => Time.now.utc})
=> #<Mongoid::Criteria
   selector: {"versions"=>{"$elemMatch"=>{#<Origin::Key:0x00000004ef1b50 @name=:updated_at, @strategy=:__override__, @operator="$lte", @expanded=nil, @block=nil>=>2012-07-17 08:12:34 UTC}}},
   options:  {},
   class:    Vote,
   embedded: false>

This return empty results

Vote.where(:"versions".elem_match => { :updated_at => { :$lte => Time.now.utc} })
=> #<Mongoid::Criteria
   selector: {"versions"=>{"$elemMatch"=>{:updated_at=>{:$lte=>2012-07-17 08:12:44 UTC}}}},
   options:  {},
   class:    Vote,
   embedded: false>

This however returns correct result. Is it no longer possible to use first approach ?

kbackowski commented 11 years ago

I'm afraid this still doesn't work for elem_match on symbols :

Vote.where(:"versions".elem_match => { :video_timestamp.lte => 20}) => #<Mongoid::Criteria   selector: {"versions"=>{"$elemMatch"=>{#<Origin::Key:0x00000004840ab8 @name=:video_timestamp, @strategy=:override, @operator="$lte", @expanded=nil, @block=nil>=>20}}},   options: {},   class: Vote,   embedded: false>

However using the elem_match method works correctly :

[12] pry(main)> Vote.elem_match(:versions => { :video_timestamp.lte => 20}) => #<Mongoid::Criteria   selector: {"versions"=>{"$elemMatch"=>{"video_timestamp"=>{"$lte"=>20}}}},   options: {},   class: Vote,   embedded: false>

My gems :

mongoid (3.0.4) origin (1.0.6)