def where(selector = nil)
clone.tap do |crit|
selector = case selector
when String then {"$where" => selector}
else
BSON::ObjectId.convert(klass, selector || {}, false).expand_complex_criteria
end
selector.each_pair do |key, value|
if crit.selector.has_key?(key)
if key.mongoid_id?
if crit.selector.has_key?("$and")
crit.selector["$and"] << { key => value }
else
crit.selector["$and"] = [{ key => crit.selector.delete(key) }, { key => value }]
end
elsif crit.selector[key].respond_to?(:merge) && value.respond_to?(:merge)
crit.selector[key] =
crit.selector[key].merge(value) do |key, old, new|
key == '$in' ? old & new : new
end
else
crit.selector[key] = value
end
else
crit.selector[key] = value
end
end
end
end