-
Type: Improvement
-
Resolution: Unresolved
-
Priority: Unknown
-
None
-
Affects Version/s: None
-
Component/s: Performance
This is from the current docs. I've tested and confirmed its the current behavior as of 7.5:
Query method .in expands ``Array``-compatible types, such as a ``Range``, when they are used with these operator methods: Band.in(year: 1950..1960) => #<Mongoid::Criteria selector: {"year"=>{"$in"=>[1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960]}}
Consider Civilization.in(year: -10000..2000) you're gonna get a really large range in Ruby memory, and transmit over the wire to the DB. Not ideal.
Instead, it would be ideal if we can use $lte/$gte operators for numeric and date types, same as do in .where method:
Band.in(year: 1950..1960) => #<Mongoid::Criteria selector: {"year"=>{"$lte"=>1950, "$gte"=>1960}}
Some types would need to retain array conversion, for example "a".."c" => ["a", "b", "c"] (though $lte/$gte may actually work in the DB, I haven't tested.)
Alternatively, we could deprecate this behavior and have users just use .where(1..3) instead. But I do think it's nice to have it in .in