Class: Mongoid::Contextual::Memory

Inherits:
Object
  • Object
show all
Includes:
Enumerable, Association::EagerLoadable, Aggregable::Memory, Queryable, Positional
Defined in:
build/mongoid-8.1/lib/mongoid/contextual/memory.rb

Instance Attribute Summary collapse

Attributes included from Queryable

#collection, #collection The collection to query against., #criteria, #criteria The criteria for the context., #klass, #klass The klass for the criteria.

Instance Method Summary collapse

Methods included from Positional

#positionally

Methods included from Queryable

#blank?

Methods included from Association::EagerLoadable

#eager_load, #eager_loadable?, #preload

Methods included from Aggregable::Memory

#aggregates, #avg, #max, #min, #sum

Constructor Details

#initialize(criteria) ⇒ Memory

Create the new in memory context.

Examples:

Create the new context.

Memory.new(criteria)

Parameters:



171
172
173
174
175
176
177
178
179
180
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 171

def initialize(criteria)
  @criteria, @klass = criteria, criteria.klass
  @documents = criteria.documents.select do |doc|
    @root ||= doc._root
    @collection ||= root.collection
    doc._matches?(criteria.selector)
  end
  apply_sorting
  apply_options
end

Instance Attribute Details

#documentsObject (readonly)

Returns the value of attribute documents.



19
20
21
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 19

def documents
  @documents
end

#matching The in memory documents that match the selector.(The) ⇒ Object (readonly)



19
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 19

attr_reader :documents, :path, :root, :selector

#pathObject (readonly)

Returns the value of attribute path.



19
20
21
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 19

def path
  @path
end

#path The atomic path.(Theatomicpath.) ⇒ Object (readonly)



19
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 19

attr_reader :documents, :path, :root, :selector

#rootObject (readonly)

Returns the value of attribute root.



19
20
21
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 19

def root
  @root
end

#root The root document.(Therootdocument.) ⇒ Object (readonly)



19
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 19

attr_reader :documents, :path, :root, :selector

#selectorObject (readonly)

Returns the value of attribute selector.



19
20
21
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 19

def selector
  @selector
end

#selector The root document selector.(Therootdocumentselector.) ⇒ Object (readonly)



19
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 19

attr_reader :documents, :path, :root, :selector

Instance Method Details

#==(other) ⇒ true | false

Check if the context is equal to the other object.

Examples:

Check equality.

context == []

Parameters:

  • other (Array)

    The other array.

Returns:

  • (true | false)

    If the objects are equal.



29
30
31
32
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 29

def ==(other)
  return false unless other.respond_to?(:entries)
  entries == other.entries
end

#deletenil Also known as: delete_all

Delete all documents in the database that match the selector.

Examples:

Delete all the documents.

context.delete

Returns:

  • (nil)

    Nil.



40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 40

def delete
  deleted = count
  removed = map do |doc|
    prepare_remove(doc)
    doc.send(:as_attributes)
  end
  unless removed.empty?
    collection.find(selector).update_one(
      positionally(selector, "$pullAll" => { path => removed }),
      session: _session
    )
  end
  deleted
end

#destroynil Also known as: destroy_all

Destroy all documents in the database that match the selector.

Examples:

Destroy all the documents.

context.destroy

Returns:

  • (nil)

    Nil.



62
63
64
65
66
67
68
69
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 62

def destroy
  deleted = count
  each do |doc|
    documents.delete_one(doc)
    doc.destroy
  end
  deleted
end

#distinct(field) ⇒ Array<Object>

Get the distinct values in the db for the provided field.

Examples:

Get the distinct values.

context.distinct(:name)

Parameters:

  • field (String | Symbol)

    The name of the field.

Returns:

  • (Array<Object>)

    The distinct values for the field.



80
81
82
83
84
85
86
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 80

def distinct(field)
  if Mongoid.legacy_pluck_distinct
    documents.map{ |doc| doc.send(field) }.uniq
  else
    pluck(field).uniq
  end
end

#eachEnumerator

Iterate over the context. If provided a block, yield to a Mongoid document for each, otherwise return an enum.

Examples:

Iterate over the context.

context.each do |doc|
  puts doc.name
end

Returns:

  • (Enumerator)

    The enumerator.



97
98
99
100
101
102
103
104
105
106
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 97

def each
  if block_given?
    documents_for_iteration.each do |doc|
      yield(doc)
    end
    self
  else
    to_enum
  end
end

#exists?(id_or_conditions = :none) ⇒ true | false

Do any documents exist for the context.

Examples:

Do any documents exist for the context.

context.exists?

Do any documents exist for given _id.

context.exists?(BSON::ObjectId(...))

Do any documents exist for given conditions.

context.exists?(name: "...")

Parameters:

  • id_or_conditions (Hash | Object | false) (defaults to: :none)

    an _id to search for, a hash of conditions, nil or false.

Returns:

  • (true | false)

    If the count is more than zero. Always false if passed nil or false.



124
125
126
127
128
129
130
131
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 124

def exists?(id_or_conditions = :none)
  case id_or_conditions
  when :none then any?
  when nil, false then false
  when Hash then Memory.new(criteria.where(id_or_conditions)).exists?
  else Memory.new(criteria.where(_id: id_or_conditions)).exists?
  end
end

#fifthDocument

Get the fifth document in the database for the criteria’s selector.

Examples:

Get the fifth document.

context.fifth

Parameters:

  • limit (Integer)

    The number of documents to return.

Returns:



464
465
466
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 464

def fifth
  eager_load([documents.fifth]).first
end

#fifth!Document

Get the fifth document in the database for the criteria’s selector or raise an error if none is found.

Examples:

Get the fifth document.

context.fifth!

Returns:



478
479
480
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 478

def fifth!
  fifth || raise_document_not_found_error
end

#first(limit = nil) ⇒ Document Also known as: one, find_first

Get the first document in the database for the criteria’s selector.

Examples:

Get the first document.

context.first

Parameters:

  • limit (Integer) (defaults to: nil)

    The number of documents to return.

Returns:



141
142
143
144
145
146
147
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 141

def first(limit = nil)
  if limit
    eager_load(documents.first(limit))
  else
    eager_load([documents.first]).first
  end
end

#first!Document

Get the first document in the database for the criteria’s selector or raise an error if none is found.

Examples:

Get the first document.

context.first!

Returns:



161
162
163
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 161

def first!
  first || raise_document_not_found_error
end

#fourthDocument

Get the fourth document in the database for the criteria’s selector.

Examples:

Get the fourth document.

context.fourth

Parameters:

  • limit (Integer)

    The number of documents to return.

Returns:



438
439
440
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 438

def fourth
  eager_load([documents.fourth]).first
end

#fourth!Document

Get the fourth document in the database for the criteria’s selector or raise an error if none is found.

Examples:

Get the fourth document.

context.fourth!

Returns:



452
453
454
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 452

def fourth!
  fourth || raise_document_not_found_error
end

#inc(incs) ⇒ Enumerator

Increment a value on all documents.

Examples:

Perform the increment.

context.inc(likes: 10)

Parameters:

  • incs (Hash)

    The operations.

Returns:

  • (Enumerator)

    The enumerator.



190
191
192
193
194
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 190

def inc(incs)
  each do |document|
    document.inc(incs)
  end
end

#last(limit = nil) ⇒ Document

Get the last document in the database for the criteria’s selector.

Examples:

Get the last document.

context.last

Parameters:

  • limit (Integer) (defaults to: nil)

    The number of documents to return.

Returns:



204
205
206
207
208
209
210
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 204

def last(limit = nil)
  if limit
    eager_load(documents.last(limit))
  else
    eager_load([documents.last]).first
  end
end

#last!Document

Get the last document in the database for the criteria’s selector or raise an error if none is found.

Examples:

Get the last document.

context.last!

Returns:



222
223
224
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 222

def last!
  last || raise_document_not_found_error
end

#lengthInteger Also known as: size

Get the length of matching documents in the context.

Examples:

Get the length of matching documents.

context.length

Returns:

  • (Integer)

    The matching length.



232
233
234
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 232

def length
  documents.length
end

#limit(value) ⇒ Memory

Limits the number of documents that are returned.

Examples:

Limit the documents.

context.limit(20)

Parameters:

  • value (Integer)

    The number of documents to return.

Returns:



245
246
247
248
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 245

def limit(value)
  self.limiting = value
  self
end

#pick(*fields) ⇒ Object | Array<Object>

Pick the field values in memory.

Examples:

Get the values in memory.

context.pick(:name)

Parameters:

  • *fields ([ String | Symbol ]...)

    Field(s) to pick.

Returns:

  • (Object | Array<Object>)

    The picked values.



276
277
278
279
280
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 276

def pick(*fields)
  if doc = documents.first
    pluck_from_doc(doc, *fields)
  end
end

#pluck(*fields) ⇒ Array<Object> | Array<Array<Object>>

Pluck the field values in memory.

Examples:

Get the values in memory.

context.pluck(:name)

Parameters:

  • *fields ([ String | Symbol ]...)

    Field(s) to pluck.

Returns:

  • (Array<Object> | Array<Array<Object>>)

    The plucked values.



258
259
260
261
262
263
264
265
266
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 258

def pluck(*fields)
  if Mongoid.legacy_pluck_distinct
    documents.pluck(*fields)
  else
    documents.map do |doc|
      pluck_from_doc(doc, *fields)
    end
  end
end

#secondDocument

Get the second document in the database for the criteria’s selector.

Examples:

Get the second document.

context.second

Parameters:

  • limit (Integer)

    The number of documents to return.

Returns:



386
387
388
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 386

def second
  eager_load([documents.second]).first
end

#second!Document

Get the second document in the database for the criteria’s selector or raise an error if none is found.

Examples:

Get the second document.

context.second!

Returns:



400
401
402
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 400

def second!
  second || raise_document_not_found_error
end

#second_to_lastDocument

Get the second to last document in the database for the criteria’s selector.

Examples:

Get the second to last document.

context.second_to_last

Parameters:

  • limit (Integer)

    The number of documents to return.

Returns:

  • (Document)

    The second to last document.



490
491
492
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 490

def second_to_last
  eager_load([documents.second_to_last]).first
end

#second_to_last!Document

Get the second to last document in the database for the criteria’s selector or raise an error if none is found.

Examples:

Get the second to last document.

context.second_to_last!

Returns:

  • (Document)

    The second to last document.



504
505
506
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 504

def second_to_last!
  second_to_last || raise_document_not_found_error
end

#skip(value) ⇒ Memory

Skips the provided number of documents.

Examples:

Skip the documents.

context.skip(20)

Parameters:

  • value (Integer)

    The number of documents to skip.

Returns:



336
337
338
339
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 336

def skip(value)
  self.skipping = value
  self
end

#sort(values) ⇒ Memory

Sorts the documents by the provided spec.

Examples:

Sort the documents.

context.sort(name: -1, title: 1)

Parameters:

  • values (Hash)

    The sorting values as field/direction(1/-1) pairs.

Returns:



350
351
352
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 350

def sort(values)
  in_place_sort(values) and self
end

#take(limit = nil) ⇒ Document

Take the given number of documents from the database.

Examples:

Take a document.

context.take

Parameters:

  • limit (Integer | nil) (defaults to: nil)

    The number of documents to take or nil.

Returns:



306
307
308
309
310
311
312
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 306

def take(limit = nil)
  if limit
    eager_load(documents.take(limit))
  else
    eager_load([documents.first]).first
  end
end

#take!Document

Take the given number of documents from the database or raise an error if none are found.

Examples:

Take a document.

context.take

Returns:



324
325
326
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 324

def take!
  take || raise_document_not_found_error
end

#tally(field) ⇒ Hash

Tally the field values in memory.

Examples:

Get the counts of values in memory.

context.tally(:name)

Parameters:

  • field (String | Symbol)

    Field to tally.

Returns:

  • (Hash)

    The hash of counts.



290
291
292
293
294
295
296
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 290

def tally(field)
  return documents.each_with_object({}) do |d, acc|
    v = retrieve_value_at_path(d, field)
    acc[v] ||= 0
    acc[v] += 1
  end
end

#thirdDocument

Get the third document in the database for the criteria’s selector.

Examples:

Get the third document.

context.third

Parameters:

  • limit (Integer)

    The number of documents to return.

Returns:



412
413
414
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 412

def third
  eager_load([documents.third]).first
end

#third!Document

Get the third document in the database for the criteria’s selector or raise an error if none is found.

Examples:

Get the third document.

context.third!

Returns:



426
427
428
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 426

def third!
  third || raise_document_not_found_error
end

#third_to_lastDocument

Get the third to last document in the database for the criteria’s selector.

Examples:

Get the third to last document.

context.third_to_last

Parameters:

  • limit (Integer)

    The number of documents to return.

Returns:

  • (Document)

    The third to last document.



516
517
518
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 516

def third_to_last
  eager_load([documents.third_to_last]).first
end

#third_to_last!Document

Get the third to last document in the database for the criteria’s selector or raise an error if none is found.

Examples:

Get the third to last document.

context.third_to_last!

Returns:

  • (Document)

    The third to last document.



530
531
532
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 530

def third_to_last!
  third_to_last || raise_document_not_found_error
end

#update(attributes = nil) ⇒ nil | false

Update the first matching document atomically.

Examples:

Update the matching document.

context.update(name: "Smiths")

Parameters:

  • attributes (Hash) (defaults to: nil)

    The new attributes for the document.

Returns:

  • (nil | false)

    False if no attributes were provided.



362
363
364
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 362

def update(attributes = nil)
  update_documents(attributes, [ first ])
end

#update_all(attributes = nil) ⇒ nil | false

Update all the matching documents atomically.

Examples:

Update all the matching documents.

context.update_all(name: "Smiths")

Parameters:

  • attributes (Hash) (defaults to: nil)

    The new attributes for each document.

Returns:

  • (nil | false)

    False if no attributes were provided.



374
375
376
# File 'build/mongoid-8.1/lib/mongoid/contextual/memory.rb', line 374

def update_all(attributes = nil)
  update_documents(attributes, entries)
end