Class: Mongoid::Criteria

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.

Example setup:

criteria = Criteria.new

criteria.only(:field).where(:field => "value").skip(20).limit(20)

criteria.execute

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Mongoid::Criterion::Optional

#ascending, #cache, #cached?, #descending, #extras, #for_ids, #limit, #offset, #order_by, #skip, #type

Methods included from Mongoid::Criterion::Inspection

#inspect

Methods included from Mongoid::Criterion::Inclusion

#all, #also_in, #and, #any_of, #find, #in, #near, #where

Methods included from Mongoid::Criterion::Exclusion

#excludes, #fields, #not_in, #only, #without

Methods included from Mongoid::Criterion::Creational

#create

Methods included from Mongoid::Criterion::Builder

#build

Constructor Details

#initialize(klass, embedded = false) ⇒ Criteria

Create the new Criteria object. This will initialize the selector and options hashes, as well as the type of criteria.

Options:

type: One of :all, :first:, or :last klass: The class to execute on.



166
167
168
169
# File 'lib/mongoid/criteria.rb', line 166

def initialize(klass, embedded = false)
  @selector = Criterion::Selector.new(klass)
  @options, @klass, @documents, @embedded = {}, klass, [], embedded
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args, &block) ⇒ Object

Used for chaining Criteria scopes together in the for of class methods on the Document the criteria is for.

Options:

name: The name of the class method on the Document to chain. args: The arguments passed to the method. block: Optional block to pass

Returns: Criteria



206
207
208
209
210
211
212
213
214
# File 'lib/mongoid/criteria.rb', line 206

def method_missing(name, *args, &block)
  if @klass.respond_to?(name)
    @klass.send(:with_scope, self) do
      @klass.send(name, *args, &block)
    end
  else
    return entries.send(name, *args)
  end
end

Instance Attribute Details

#collectionObject

Returns the value of attribute collection.



37
38
39
# File 'lib/mongoid/criteria.rb', line 37

def collection
  @collection
end

#documentsObject

Returns the value of attribute documents.



37
38
39
# File 'lib/mongoid/criteria.rb', line 37

def documents
  @documents
end

#embeddedObject

Returns the value of attribute embedded.



37
38
39
# File 'lib/mongoid/criteria.rb', line 37

def embedded
  @embedded
end

#field_listObject

Returns the value of attribute field_list.



37
38
39
# File 'lib/mongoid/criteria.rb', line 37

def field_list
  @field_list
end

#idsObject

Returns the value of attribute ids.



37
38
39
# File 'lib/mongoid/criteria.rb', line 37

def ids
  @ids
end

#klassObject

Returns the value of attribute klass.



37
38
39
# File 'lib/mongoid/criteria.rb', line 37

def klass
  @klass
end

#optionsObject

Returns the value of attribute options.



37
38
39
# File 'lib/mongoid/criteria.rb', line 37

def options
  @options
end

#selectorObject

Returns the value of attribute selector.



37
38
39
# File 'lib/mongoid/criteria.rb', line 37

def selector
  @selector
end

Instance Method Details

#+(other) ⇒ Object

Concatinate the criteria with another enumerable. If the other is a Criteria then it needs to get the collection from it.



72
73
74
# File 'lib/mongoid/criteria.rb', line 72

def +(other)
  entries + comparable(other)
end

#-(other) ⇒ Object

Returns the difference between the criteria and another enumerable. If the other is a Criteria then it needs to get the collection from it.



78
79
80
# File 'lib/mongoid/criteria.rb', line 78

def -(other)
  entries - comparable(other)
end

#==(other) ⇒ Object

Returns true if the supplied Enumerable or Criteria is equal to the results of this Criteria or the criteria itself.

This will force a database load when called if an enumerable is passed.

Options:

other: The other Enumerable or Criteria to compare to.



90
91
92
93
94
95
96
97
98
99
# File 'lib/mongoid/criteria.rb', line 90

def ==(other)
  case other
  when Criteria
    self.selector == other.selector && self.options == other.options
  when Enumerable
    return (execute.entries == other)
  else
    return false
  end
end

#as_json(options = nil) ⇒ String

Needed to properly get a criteria back as json

Examples:

Get the criteria as json.

Person.where(:title => "Sir").as_json

Parameters:

  • options (Hash) (defaults to: nil)

    Options to pass through to the serializer.

Returns:

  • (String)

    The JSON string.



249
250
251
# File 'lib/mongoid/criteria.rb', line 249

def as_json(options = nil)
  entries.as_json(options)
end

#contextObject

Return or create the context in which this criteria should be executed.

This will return an Enumerable context if the class is embedded, otherwise it will return a Mongo context for root classes.



105
106
107
# File 'lib/mongoid/criteria.rb', line 105

def context
  @context ||= Contexts.context_for(self, embedded)
end

#each(&block) ⇒ Object

Iterate over each Document in the results. This can take an optional block to pass to each argument in the results.

Example:

criteria.each { |doc| p doc }



115
116
117
# File 'lib/mongoid/criteria.rb', line 115

def each(&block)
  tap { context.iterate(&block) }
end

#exists?Boolean

Return true if the criteria has some Document or not

Example:

criteria.exists?

Returns:



124
125
126
# File 'lib/mongoid/criteria.rb', line 124

def exists?
  context.count > 0
end

#freezeCriteria

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.

Examples:

Freeze the criteria.

criteria.freeze

Returns:

Since:

  • 2.0.0



138
139
140
# File 'lib/mongoid/criteria.rb', line 138

def freeze
  context and super
end

#fuse(criteria_conditions = {}) ⇒ Object

Merges the supplied argument hash into a single criteria

Options:

criteria_conditions: Hash of criteria keys, and parameter values

Example:

criteria.fuse(:where => { :field => "value"}, :limit => 20)

Returns self



153
154
155
156
157
# File 'lib/mongoid/criteria.rb', line 153

def fuse(criteria_conditions = {})
  criteria_conditions.inject(self) do |criteria, (key, value)|
    criteria.send(key, value)
  end
end

#merge(other) ⇒ Object

Merges another object into this 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.

Options:

other: The Criteria or Hash to merge with.

Example:

criteria.merge({ :conditions => { :title => "Sir" } })



182
183
184
185
186
187
188
189
190
191
192
193
194
# File 'lib/mongoid/criteria.rb', line 182

def merge(other)
  clone.tap do |crit|
    if other.is_a?(Criteria)
      crit.selector.update(other.selector)
      crit.options.update(other.options)
      crit.documents = other.documents
    else
      duped = other.dup
      crit.selector.update(duped.delete(:conditions) || {})
      crit.options.update(duped)
    end
  end
end

#raise_invalidObject

Convenience method of raising an invalid options error.

Examples:

Raise the error.

criteria.raise_invalid

Raises:

Since:

  • 2.0.0



298
299
300
# File 'lib/mongoid/criteria.rb', line 298

def raise_invalid
  raise Errors::InvalidOptions.new(:calling_document_find_with_nil_is_invalid, {})
end

#respond_to?(name, include_private = false) ⇒ Boolean

Returns true if criteria responds to the given method.

Options:

name: The name of the class method on the Document. include_private: The arguments passed to the method.

Example:

criteria.respond_to?(:batch_update)

Returns:



226
227
228
229
# File 'lib/mongoid/criteria.rb', line 226

def respond_to?(name, include_private = false)
  # don't include klass private methods because method_missing won't call them
  super || @klass.respond_to?(name) || entries.respond_to?(name, include_private)
end

#scopedObject

Returns the selector and options as a Hash that would be passed to a scope for use with named scopes.



233
234
235
236
237
238
# File 'lib/mongoid/criteria.rb', line 233

def scoped
  scope_options = @options.dup
  sorting = scope_options.delete(:sort)
  scope_options[:order_by] = sorting if sorting
  { :where => @selector }.merge(scope_options)
end

#search(*args) ⇒ Array<Symbol, Criteria>

Search for documents based on a variety of args.

Examples:

Find by an id.

criteria.search(BSON::ObjectId.new)

Find by multiple ids.

criteria.search([ BSON::ObjectId.new, BSON::ObjectId.new ])

Conditionally find all matching documents.

criteria.search(:all, :conditions => { :title => "Sir" })

Conditionally find the first document.

criteria.search(:first, :conditions => { :title => "Sir" })

Conditionally find the last document.

criteria.search(:last, :conditions => { :title => "Sir" })

Parameters:

Returns:

Since:

  • 2.0.0



277
278
279
280
281
282
283
284
285
286
287
288
# File 'lib/mongoid/criteria.rb', line 277

def search(*args)
  raise_invalid if args[0].nil?
  type = args[0]
  params = args[1] || {}
  return [ :ids, for_ids(type) ] unless type.is_a?(Symbol)
  conditions = params.delete(:conditions) || {}
  if conditions.include?(:id)
    conditions[:_id] = conditions[:id]
    conditions.delete(:id)
  end
  return [ type, where(conditions).extras(params) ]
end