Class: Mongoid::Criteria
- Inherits:
-
Object
- Object
- Mongoid::Criteria
- Includes:
- Enumerable, Mongoid::Clients::Options, Contextual, Findable, Includable, Inspectable, 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/inspectable.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/macroable.rb,
lib/mongoid/criteria/queryable/mergeable.rb,
lib/mongoid/criteria/queryable/aggregable.rb,
lib/mongoid/criteria/queryable/selectable.rb,
lib/mongoid/criteria/queryable/forwardable.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
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, Inspectable, Marshalable, Modifiable, Options, Permission, Queryable, Scopable
Constant Summary collapse
- CHECK =
Static array used to check with method missing - we only need to ever instantiate once.
[]
Instance Attribute Summary collapse
-
#embedded ⇒ Object
Returns the value of attribute embedded.
-
#klass ⇒ Object
Returns the value of attribute klass.
-
#metadata ⇒ Object
Returns the value of attribute metadata.
-
#parent_document ⇒ Object
Returns the value of attribute parent_document.
Attributes included from Queryable
#aliases, #aliases The aliases., #driver, #driver The Mongo driver being used., #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.
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. -
#as_json(options = nil) ⇒ String
Needed to properly get a criteria back as json.
-
#cache ⇒ Criteria
Tells the criteria that the cursor that gets returned needs to be cached.
-
#cached? ⇒ true, false
Will return true if the cache option has been set.
-
#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.
-
#for_js(javascript, scope = {}) ⇒ Criteria
Find documents by the provided javascript and scope.
-
#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
criteria.merge({ klass: Band, where: { name: “Depeche Mode” }, order_by: { name: 1 } }).
-
#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
Overriden to include _type in the fields.
-
#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
Convenience for objects that want to be merged into a criteria.
-
#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. -
#where(expression) ⇒ Criteria
This is the general entry point for most MongoDB queries.
-
#without(*args) ⇒ Criteria
Overriden to exclude _id from the fields.
-
#without_options ⇒ Criteria
Get a version of this criteria without the options.
Methods included from Mongoid::Clients::Options
#collection, #collection_name, #mongo_client, #persistence_context, #with
Methods included from Scopable
#apply_default_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 Inspectable
Methods included from Findable
#execute_or_raise, #find, #for_ids, #multiple_from_db
Methods included from Queryable::Optional
#ascending, #batch_size, #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
#intersect, #override, #reset_strategies!, #union
Methods included from Contextual
Constructor Details
#initialize(klass) ⇒ Criteria
Initialize the new criteria.
197 198 199 200 |
# File 'lib/mongoid/criteria.rb', line 197 def initialize(klass) @klass = klass klass ? super(klass.aliased_fields, klass.fields) : super({}, {}) end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(name, *args, &block) ⇒ Object (private)
Used for chaining Criteria
scopes together in the for of class methods on the Document
the criteria is for.
497 498 499 500 501 502 503 504 505 506 507 |
# File 'lib/mongoid/criteria.rb', line 497 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
#embedded ⇒ Object
Returns the value of attribute embedded.
38 39 40 |
# File 'lib/mongoid/criteria.rb', line 38 def @embedded end |
#klass ⇒ Object
Returns the value of attribute klass.
38 39 40 |
# File 'lib/mongoid/criteria.rb', line 38 def klass @klass end |
#metadata ⇒ Object
Returns the value of attribute metadata.
38 39 40 |
# File 'lib/mongoid/criteria.rb', line 38 def @metadata end |
#parent_document ⇒ Object
Returns the value of attribute parent_document.
38 39 40 |
# File 'lib/mongoid/criteria.rb', line 38 def parent_document @parent_document 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.
50 51 52 53 |
# File 'lib/mongoid/criteria.rb', line 50 def ==(other) return super if other.respond_to?(:selector) entries == other end |
#as_json(options = nil) ⇒ String
Needed to properly get a criteria back as json
63 64 65 |
# File 'lib/mongoid/criteria.rb', line 63 def as_json( = nil) entries.as_json() end |
#cache ⇒ Criteria
Tells the criteria that the cursor that gets returned needs to be cached. This is so multiple iterations don’t hit the database multiple times, however this is not advisable when working with large data sets as the entire results will get stored in memory.
76 77 78 79 80 |
# File 'lib/mongoid/criteria.rb', line 76 def cache crit = clone crit..merge!(cache: true) crit end |
#cached? ⇒ true, false
Will return true if the cache option has been set.
88 89 90 |
# File 'lib/mongoid/criteria.rb', line 88 def cached? [:cache] == true end |
#documents ⇒ Array<Document>
Get the documents from the embedded criteria.
100 101 102 |
# File 'lib/mongoid/criteria.rb', line 100 def documents @documents ||= [] end |
#documents=(docs) ⇒ Array<Document>
Set the embedded documents on the criteria.
113 114 115 |
# File 'lib/mongoid/criteria.rb', line 113 def documents=(docs) @documents = docs end |
#embedded? ⇒ true, false
Is the criteria for embedded documents?
125 126 127 |
# File 'lib/mongoid/criteria.rb', line 125 def !!@embedded end |
#empty_and_chainable? ⇒ true, false
Is the criteria an empty but chainable criteria?
269 270 271 |
# File 'lib/mongoid/criteria.rb', line 269 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.
138 139 140 |
# File 'lib/mongoid/criteria.rb', line 138 def extract_id selector.extract_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)
153 154 155 156 157 |
# File 'lib/mongoid/criteria.rb', line 153 def extras(extras) crit = clone crit..merge!(extras) crit end |
#field_list ⇒ Array<String>
Get the list of included fields.
167 168 169 170 171 172 173 |
# File 'lib/mongoid/criteria.rb', line 167 def field_list if [:fields] [:fields].keys.reject{ |key| key == "_type" } else [] 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.
434 435 436 |
# File 'lib/mongoid/criteria.rb', line 434 def for_js(javascript, scope = {}) js_query(BSON::CodeWithScope.new(javascript, scope)) 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.
185 186 187 |
# File 'lib/mongoid/criteria.rb', line 185 def freeze context and inclusions and super end |
#merge(other) ⇒ Criteria
criteria.merge({
klass: Band,
where: { name: "Depeche Mode" },
order_by: { name: 1 }
})
222 223 224 225 226 |
# File 'lib/mongoid/criteria.rb', line 222 def merge(other) crit = clone crit.merge!(other) crit end |
#merge!(other) ⇒ Criteria
Merge the other criteria into this one.
238 239 240 241 242 243 244 245 246 |
# File 'lib/mongoid/criteria.rb', line 238 def merge!(other) criteria = other.to_criteria selector.merge!(criteria.selector) .merge!(criteria.) self.documents = criteria.documents.dup unless criteria.documents.empty? self. = criteria. self.inclusions = (inclusions + criteria.inclusions).uniq self end |
#none ⇒ Criteria
Returns a criteria that will always contain zero results and never hits the database.
257 258 259 |
# File 'lib/mongoid/criteria.rb', line 257 def none @none = true and self end |
#only(*args) ⇒ Criteria
Overriden to include _type in the fields.
283 284 285 286 287 288 289 290 291 292 293 294 |
# File 'lib/mongoid/criteria.rb', line 283 def only(*args) return clone if args.flatten.empty? args = args.flatten if (args & Fields::IDS).empty? args.unshift(:_id) end if klass.hereditary? super(*args.push(:_type)) else super(*args) end end |
#read(value = nil) ⇒ Criteria
Set the read preference for the criteria.
306 307 308 309 310 |
# File 'lib/mongoid/criteria.rb', line 306 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.
336 337 338 |
# File 'lib/mongoid/criteria.rb', line 336 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.
350 351 352 |
# File 'lib/mongoid/criteria.rb', line 350 def to_criteria self end |
#to_proc ⇒ Proc
Convert the criteria to a proc.
362 363 364 |
# File 'lib/mongoid/criteria.rb', line 362 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.
376 377 378 |
# File 'lib/mongoid/criteria.rb', line 376 def type(types) any_in(_type: Array(types)) end |
#where(expression) ⇒ 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.
398 399 400 401 402 403 |
# File 'lib/mongoid/criteria.rb', line 398 def where(expression) if expression.is_a?(::String) && raise Errors::UnsupportedJavascript.new(klass, expression) end super end |
#without(*args) ⇒ Criteria
Overriden to exclude _id from the fields.
322 323 324 325 |
# File 'lib/mongoid/criteria.rb', line 322 def without(*args) args -= Fields::IDS super(*args) end |
#without_options ⇒ Criteria
Get a version of this criteria without the options.
414 415 416 417 418 |
# File 'lib/mongoid/criteria.rb', line 414 def crit = clone crit..clear crit end |