Class: Mongoid::Criteria
- Inherits:
-
Object
- Object
- Mongoid::Criteria
- Includes:
- Enumerable, Inspectable, Mongoid::Clients::Options, Mongoid::Clients::Sessions, Contextual, Findable, Includable, Marshalable, Modifiable, Options, Queryable, Scopable
- Defined in:
- lib/mongoid/criteria.rb,
lib/mongoid/criteria/options.rb,
lib/mongoid/criteria/findable.rb,
lib/mongoid/criteria/scopable.rb,
lib/mongoid/criteria/queryable.rb,
lib/mongoid/criteria/includable.rb,
lib/mongoid/criteria/modifiable.rb,
lib/mongoid/criteria/permission.rb,
lib/mongoid/criteria/translator.rb,
lib/mongoid/criteria/marshalable.rb,
lib/mongoid/criteria/queryable/key.rb,
lib/mongoid/criteria/queryable/smash.rb,
lib/mongoid/criteria/queryable/options.rb,
lib/mongoid/criteria/queryable/optional.rb,
lib/mongoid/criteria/queryable/pipeline.rb,
lib/mongoid/criteria/queryable/selector.rb,
lib/mongoid/criteria/queryable/storable.rb,
lib/mongoid/criteria/queryable/macroable.rb,
lib/mongoid/criteria/queryable/mergeable.rb,
lib/mongoid/criteria/queryable/aggregable.rb,
lib/mongoid/criteria/queryable/expandable.rb,
lib/mongoid/criteria/queryable/selectable.rb,
lib/mongoid/criteria/queryable/extensions/set.rb,
lib/mongoid/criteria/queryable/extensions/date.rb,
lib/mongoid/criteria/queryable/extensions/hash.rb,
lib/mongoid/criteria/queryable/extensions/time.rb,
lib/mongoid/criteria/queryable/extensions/array.rb,
lib/mongoid/criteria/queryable/extensions/range.rb,
lib/mongoid/criteria/queryable/extensions/object.rb,
lib/mongoid/criteria/queryable/extensions/regexp.rb,
lib/mongoid/criteria/queryable/extensions/string.rb,
lib/mongoid/criteria/queryable/extensions/symbol.rb,
lib/mongoid/criteria/queryable/extensions/boolean.rb,
lib/mongoid/criteria/queryable/extensions/numeric.rb,
lib/mongoid/criteria/queryable/extensions/date_time.rb,
lib/mongoid/criteria/queryable/extensions/nil_class.rb,
lib/mongoid/criteria/queryable/extensions/big_decimal.rb,
lib/mongoid/criteria/queryable/extensions/time_with_zone.rb more...
Overview
The Criteria
class is the core object needed in Mongoid to retrieve objects from the database. It is a DSL that essentially sets up the selector and options arguments that get passed on to a Mongo::Collection in the Ruby driver. Each method on the Criteria
returns self to they can be chained in order to create a readable criterion to be executed against the database.
Defined Under Namespace
Modules: Findable, Includable, Marshalable, Modifiable, Options, Permission, Queryable, Scopable, Translator
Constant Summary collapse
- CHECK =
Static array used to check with method missing - we only need to ever instantiate once.
[]
Instance Attribute Summary collapse
-
#_raw_results ⇒ nil | Hash
private
An internal helper for getting/setting the “raw” flag on a given criteria object.
-
#association ⇒ Object
Returns the value of attribute association.
-
#embedded ⇒ Object
Returns the value of attribute embedded.
-
#klass ⇒ Object
Returns the value of attribute klass.
-
#parent_document ⇒ Object
Returns the value of attribute parent_document.
Attributes included from Modifiable
#create_attrs, #create_attrs Additional attributes to add to the Document upon creation.
Attributes included from Queryable
#aliases, #aliases The aliases., #serializers, #serializers The serializers.
Attributes included from Queryable::Optional
#options, #options The query options.
Attributes included from Queryable::Aggregable
#aggregating, #aggregating Flag for whether or not we are aggregating., #pipeline, #pipeline The aggregation pipeline.
Attributes included from Queryable::Mergeable
#strategy, #strategy The name of the current strategy.
Class Method Summary collapse
-
.from_hash(hash) ⇒ Criteria
Convert the given hash to a criteria.
Instance Method Summary collapse
-
#==(other) ⇒ true | false
Returns true if the supplied
Enumerable
orCriteria
is equal to the results of thisCriteria
or the criteria itself. - #_enumerable_find ⇒ Object private
- #_findable_find ⇒ Object private
-
#as_json(options = nil) ⇒ String
Needed to properly get a criteria back as json.
-
#documents ⇒ Array<Document>
Get the documents from the embedded criteria.
-
#documents=(docs) ⇒ Array<Document>
Set the embedded documents on the criteria.
-
#embedded? ⇒ true | false
Is the criteria for embedded documents?.
-
#empty_and_chainable? ⇒ true | false
Is the criteria an empty but chainable criteria?.
-
#extract_id ⇒ Object
Extract a single id from the provided criteria.
-
#extras(extras) ⇒ Criteria
Adds a criterion to the
Criteria
that specifies additional options to be passed to the Ruby driver, in the exact format for the driver. -
#field_list ⇒ Array<String>
Get the list of included fields.
-
#find(*args) {|Object| ... } ⇒ Document | Array<Document> | nil
Finds one or many documents given the provided _id values, or filters the documents in the current scope in the application process space after loading them if needed.
- #for_js(javascript, scope = {}) ⇒ Criteria deprecated Deprecated.
-
#freeze ⇒ Criteria
When freezing a criteria we need to initialize the context first otherwise the setting of the context on attempted iteration will raise a runtime error.
-
#initialize(klass) ⇒ Criteria
constructor
Initialize the new criteria.
-
#merge(other) ⇒ Criteria
Merges another object with this
Criteria
and returns a new criteria. -
#merge!(other) ⇒ Criteria
Merge the other criteria into this one.
-
#none ⇒ Criteria
Returns a criteria that will always contain zero results and never hits the database.
-
#only(*args) ⇒ Criteria
Overridden to include _type in the fields.
-
#raw(raw_results = true, typed: nil) ⇒ Criteria
Produce a clone of the current criteria object with it’s “raw” setting set to the given value.
-
#raw_results? ⇒ true | false
Predicate that answers the question: is this criteria object currently in raw mode? (See #raw for a description of raw mode.).
-
#read(value = nil) ⇒ Criteria
Set the read preference for the criteria.
-
#respond_to?(name, include_private = false) ⇒ true | false
Returns true if criteria responds to the given method.
- #to_criteria ⇒ Criteria deprecated Deprecated.
-
#to_proc ⇒ Proc
Convert the criteria to a proc.
-
#type(types) ⇒ Criteria
Adds a criterion to the
Criteria
that specifies a type or an Array of types that must be matched. -
#typecast_results? ⇒ true | false
Predicate that answers the question: should the results returned by this criteria object be typecast? (See #raw for a description of this.) The answer is meaningless unless #raw_results? is true, since if instantiated document objects are returned they will always be typecast.
-
#where(*args) ⇒ Criteria
This is the general entry point for most MongoDB queries.
-
#without(*args) ⇒ Criteria
Overridden to exclude _id from the fields.
-
#without_options ⇒ Criteria
Get a version of this criteria without the options.
Methods included from Mongoid::Clients::Sessions
Methods included from Mongoid::Clients::Options
#collection, #collection_name, #mongo_client, #persistence_context, #persistence_context?, #with
Methods included from Scopable
#apply_default_scope, #apply_scope, #remove_scoping, #scoped, #scoped?, #scoping_options, #scoping_options=, #unscoped, #unscoped?, #with_default_scope
Methods included from Modifiable
#build, #create, #create!, #create_with, #find_or_create_by, #find_or_create_by!, #find_or_initialize_by, #first_or_create, #first_or_create!, #first_or_initialize
Methods included from Marshalable
Methods included from Includable
#includes, #inclusions, #inclusions=
Methods included from Findable
#execute_or_raise, #for_ids, #multiple_from_db
Methods included from Queryable
Methods included from Queryable::Optional
#ascending, #batch_size, #collation, #comment, #cursor_type, #descending, forwardables, #hint, #limit, #max_scan, #max_time_ms, #no_timeout, #order_by, #reorder, #skip, #slice, #snapshot
Methods included from Queryable::Macroable
Methods included from Selectable
Methods included from Queryable::Aggregable
#aggregating?, #group, #project, #unwind
Methods included from Queryable::Mergeable
#and_with_operator, #intersect, #override, #reset_strategies!, #union
Methods included from Queryable::Storable
#add_field_expression, #add_logical_operator_expression, #add_one_expression, #add_operator_expression
Methods included from Contextual
Constructor Details
#initialize(klass) ⇒ Criteria
Initialize the new criteria.
294 295 296 297 298 299 |
# File 'lib/mongoid/criteria.rb', line 294 def initialize(klass) @klass = klass @embedded = nil @none = nil klass ? super(klass.aliased_fields, klass.fields, klass.relations, klass.aliased_associations) : super({}, {}, {}, {}) end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing ⇒ Object (private)
Used for chaining Criteria
scopes together in the for of class methods on the Document
the criteria is for.
593 594 595 596 597 598 599 600 601 602 603 |
# File 'lib/mongoid/criteria.rb', line 593 ruby2_keywords def method_missing(name, *args, &block) if klass.respond_to?(name) klass.send(:with_scope, self) do klass.send(name, *args, &block) end elsif CHECK.respond_to?(name) return entries.send(name, *args, &block) else super end end |
Instance Attribute Details
#_raw_results ⇒ nil | Hash
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
An internal helper for getting/setting the “raw” flag on a given criteria object.
215 216 217 |
# File 'lib/mongoid/criteria.rb', line 215 def _raw_results @_raw_results end |
#association ⇒ Object
Returns the value of attribute association.
68 69 70 |
# File 'lib/mongoid/criteria.rb', line 68 def association @association end |
#embedded ⇒ Object
Returns the value of attribute embedded.
68 69 70 |
# File 'lib/mongoid/criteria.rb', line 68 def @embedded end |
#klass ⇒ Object
Returns the value of attribute klass.
68 69 70 |
# File 'lib/mongoid/criteria.rb', line 68 def klass @klass end |
#parent_document ⇒ Object
Returns the value of attribute parent_document.
68 69 70 |
# File 'lib/mongoid/criteria.rb', line 68 def parent_document @parent_document end |
Class Method Details
.from_hash(hash) ⇒ Criteria
Convert the given hash to a criteria. Will iterate over each keys in the hash which must correspond to method on a criteria object. The hash must also include a “klass” key.
55 56 57 58 59 60 61 |
# File 'lib/mongoid/criteria.rb', line 55 def from_hash(hash) criteria = Criteria.new(hash.delete(:klass) || hash.delete('klass')) hash.each_pair do |method, args| criteria = criteria.__send__(method, args) end criteria end |
Instance Method Details
#==(other) ⇒ true | false
This will force a database load when called if an enumerable is passed.
Returns true if the supplied Enumerable
or Criteria
is equal to the results of this Criteria
or the criteria itself.
78 79 80 81 |
# File 'lib/mongoid/criteria.rb', line 78 def ==(other) return super if other.respond_to?(:selector) entries == other end |
#_enumerable_find ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
26 |
# File 'lib/mongoid/criteria.rb', line 26 alias :_enumerable_find :find |
#_findable_find ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
33 |
# File 'lib/mongoid/criteria.rb', line 33 alias :_findable_find :find |
#as_json(options = nil) ⇒ String
Needed to properly get a criteria back as json
140 141 142 |
# File 'lib/mongoid/criteria.rb', line 140 def as_json( = nil) entries.as_json() end |
#documents ⇒ Array<Document>
Get the documents from the embedded criteria.
150 151 152 |
# File 'lib/mongoid/criteria.rb', line 150 def documents @documents ||= [] end |
#documents=(docs) ⇒ Array<Document>
Set the embedded documents on the criteria.
161 162 163 |
# File 'lib/mongoid/criteria.rb', line 161 def documents=(docs) @documents = docs end |
#embedded? ⇒ true | false
Is the criteria for embedded documents?
171 172 173 |
# File 'lib/mongoid/criteria.rb', line 171 def !!@embedded end |
#empty_and_chainable? ⇒ true | false
Is the criteria an empty but chainable criteria?
363 364 365 |
# File 'lib/mongoid/criteria.rb', line 363 def empty_and_chainable? !!@none end |
#extract_id ⇒ Object
Extract a single id from the provided criteria. Could be in an $and query or a straight _id query.
243 244 245 |
# File 'lib/mongoid/criteria.rb', line 243 def extract_id selector['_id'] || selector[:_id] || selector['id'] || selector[:id] end |
#extras(extras) ⇒ Criteria
Adds a criterion to the Criteria
that specifies additional options to be passed to the Ruby driver, in the exact format for the driver.
criteria.extras(:limit => 20, :skip => 40)
256 257 258 259 260 |
# File 'lib/mongoid/criteria.rb', line 256 def extras(extras) crit = clone crit..merge!(extras) crit end |
#field_list ⇒ Array<String>
Get the list of included fields.
268 269 270 271 272 273 274 |
# File 'lib/mongoid/criteria.rb', line 268 def field_list if [:fields] [:fields].keys.reject{ |key| key == klass.discriminator_key } else [] end end |
#find(*args) {|Object| ... } ⇒ Document | Array<Document> | nil
Each argument can be an individual id, an array of ids or a nested array. Each array will be flattened.
Finds one or many documents given the provided _id values, or filters the documents in the current scope in the application process space after loading them if needed.
If this method is not given a block, it delegates to Findable#find and finds one or many documents for the provided _id values.
If this method is given a block, it delegates to Enumerable#find and returns the first document of those found by the current Criteria object for which the block returns a truthy value.
Note that the “default proc” argument of Enumerable is not specially treated by Mongoid - the decision between delegating to Findable
vs Enumerable
is made solely based on whether find
is passed a block.
124 125 126 127 128 129 130 |
# File 'lib/mongoid/criteria.rb', line 124 def find(*args, &block) if block_given? _enumerable_find(*args, &block) else _findable_find(*args) end end |
#for_js(javascript, scope = {}) ⇒ Criteria
Find documents by the provided javascript and scope. Uses a $where but is different from Criteria#where in that it will pass a code object to the query instead of a pure string. Safe against Javascript injection attacks.
528 529 530 531 532 533 534 535 536 |
# File 'lib/mongoid/criteria.rb', line 528 def for_js(javascript, scope = {}) code = if scope.empty? # CodeWithScope is not supported for $where as of MongoDB 4.4 BSON::Code.new(javascript) else BSON::CodeWithScope.new(javascript, scope) end js_query(code) end |
#freeze ⇒ Criteria
When freezing a criteria we need to initialize the context first otherwise the setting of the context on attempted iteration will raise a runtime error.
284 285 286 |
# File 'lib/mongoid/criteria.rb', line 284 def freeze context and inclusions and super end |
#merge(other) ⇒ Criteria
Merges another object with this Criteria
and returns a new criteria. The other object may be a Criteria
or a Hash
. This is used to combine multiple scopes together, where a chained scope situation may be desired.
321 322 323 324 325 |
# File 'lib/mongoid/criteria.rb', line 321 def merge(other) crit = clone crit.merge!(other) crit end |
#merge!(other) ⇒ Criteria
Merge the other criteria into this one.
335 336 337 338 339 340 341 342 343 344 |
# File 'lib/mongoid/criteria.rb', line 335 def merge!(other) other = self.class.from_hash(other) if other.is_a?(Hash) selector.merge!(other.selector) .merge!(other.) self.documents = other.documents.dup unless other.documents.empty? self. = other. self.inclusions = (inclusions + other.inclusions).uniq self._raw_results = self._raw_results || other._raw_results self end |
#none ⇒ Criteria
Returns a criteria that will always contain zero results and never hits the database.
353 354 355 |
# File 'lib/mongoid/criteria.rb', line 353 def none @none = true and self end |
#only(*args) ⇒ Criteria
Overridden to include _type in the fields.
375 376 377 378 379 380 381 382 383 384 385 |
# File 'lib/mongoid/criteria.rb', line 375 def only(*args) args = args.flatten return clone if args.empty? if (args & Fields::IDS).empty? args.unshift(:_id) end if klass.hereditary? args.push(klass.discriminator_key.to_sym) end super(*args) end |
#raw(raw_results = true, typed: nil) ⇒ Criteria
Produce a clone of the current criteria object with it’s “raw” setting set to the given value. A criteria set to “raw” will return all results as raw hashes. If ‘typed` is true, the values in the hashes will be typecast according to the fields that they correspond to.
When “raw” is not set (or if ‘raw_results` is false), the criteria will return all results as instantiated Document instances.
193 194 195 196 197 198 199 200 201 202 203 204 205 |
# File 'lib/mongoid/criteria.rb', line 193 def raw(raw_results = true, typed: nil) # default for typed is true when raw_results is false, and false when # raw_results is true. typed = !raw_results if typed.nil? if !typed && !raw_results raise ArgumentError, 'instantiated results must be typecast' end clone.tap do |criteria| criteria._raw_results = { raw: raw_results, typed: typed } end end |
#raw_results? ⇒ true | false
Predicate that answers the question: is this criteria object currently in raw mode? (See #raw for a description of raw mode.)
221 222 223 |
# File 'lib/mongoid/criteria.rb', line 221 def raw_results? _raw_results && _raw_results[:raw] end |
#read(value = nil) ⇒ Criteria
Set the read preference for the criteria.
395 396 397 398 399 |
# File 'lib/mongoid/criteria.rb', line 395 def read(value = nil) clone.tap do |criteria| criteria..merge!(read: value) end end |
#respond_to?(name, include_private = false) ⇒ true | false
Returns true if criteria responds to the given method.
423 424 425 |
# File 'lib/mongoid/criteria.rb', line 423 def respond_to?(name, include_private = false) super || klass.respond_to?(name) || CHECK.respond_to?(name, include_private) end |
#to_criteria ⇒ Criteria
Convenience for objects that want to be merged into a criteria.
436 437 438 |
# File 'lib/mongoid/criteria.rb', line 436 def to_criteria self end |
#to_proc ⇒ Proc
Convert the criteria to a proc.
447 448 449 |
# File 'lib/mongoid/criteria.rb', line 447 def to_proc ->{ self } end |
#type(types) ⇒ Criteria
Adds a criterion to the Criteria
that specifies a type or an Array of types that must be matched.
461 462 463 |
# File 'lib/mongoid/criteria.rb', line 461 def type(types) any_in(self.discriminator_key.to_sym => Array(types)) end |
#typecast_results? ⇒ true | false
Predicate that answers the question: should the results returned by this criteria object be typecast? (See #raw for a description of this.) The answer is meaningless unless #raw_results? is true, since if instantiated document objects are returned they will always be typecast.
232 233 234 |
# File 'lib/mongoid/criteria.rb', line 232 def typecast_results? _raw_results && _raw_results[:typed] end |
#where(*args) ⇒ Criteria
This is the general entry point for most MongoDB queries. This either creates a standard field: value selection, and expanded selection with the use of hash methods, or a $where selection if a string is provided.
482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 |
# File 'lib/mongoid/criteria.rb', line 482 def where(*args) # Historically this method required exactly one argument. # As of https://jira.mongodb.org/browse/MONGOID-4804 it also accepts # zero arguments. # The underlying where implementation that super invokes supports # any number of arguments, but we don't presently allow multiple # arguments through this method. This API can be reconsidered in the # future. if args.length > 1 raise ArgumentError, "Criteria#where requires zero or one arguments (given #{args.length})" end if args.length == 1 expression = args.first if expression.is_a?(::String) && raise Errors::UnsupportedJavascript.new(klass, expression) end end super end |
#without(*args) ⇒ Criteria
Overridden to exclude _id from the fields.
409 410 411 412 |
# File 'lib/mongoid/criteria.rb', line 409 def without(*args) args -= id_fields super(*args) end |
#without_options ⇒ Criteria
Get a version of this criteria without the options.
508 509 510 511 512 |
# File 'lib/mongoid/criteria.rb', line 508 def crit = clone crit..clear crit end |