Module: Mongo::Collection::View::Writable

Included in:
Mongo::Collection::View
Defined in:
lib/mongo/collection/view/writable.rb

Overview

Defines write related behavior for collection view.

Since:

  • 2.0.0

Constant Summary collapse

ARRAY_FILTERS =

The array filters field constant.

Since:

  • 2.5.0

'array_filters'.freeze

Instance Method Summary collapse

Instance Method Details

#delete_many(opts = {}) ⇒ Result

Remove documents from the collection.

Examples:

Remove multiple documents from the collection.

collection_view.delete_many

Parameters:

  • opts (Hash) (defaults to: {})

    The options.

Options Hash (opts):

  • :collation (Hash)

    The collation to use.

  • :session (Session)

    The session to use.

  • :hint (Hash | String)

    The index to use for this operation. May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. “id”).

  • :write_concern (Hash)

    The write concern options. Can be :w => Integer, :fsync => Boolean, :j => Boolean.

Returns:

  • (Result)

    The response from the database.

Since:

  • 2.0.0



177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
# File 'lib/mongo/collection/view/writable.rb', line 177

def delete_many(opts = {})
  delete_doc = { Operation::Q => filter, Operation::LIMIT => 0 }
  with_session(opts) do |session|
    write_concern = if opts[:write_concern]
      WriteConcern.get(opts[:write_concern])
    else
      write_concern_with_session(session)
    end
    nro_write_with_retry(session, write_concern) do |server|
      apply_collation!(delete_doc, server, opts)
      apply_hint!(delete_doc, server, opts.merge(write_concern: write_concern))

      Operation::Delete.new(
          :deletes => [ delete_doc ],
          :db_name => collection.database.name,
          :coll_name => collection.name,
          :write_concern => write_concern,
          :bypass_document_validation => !!opts[:bypass_document_validation], 
          :session => session
      ).execute(server, client: client)
    end
  end
end

#delete_one(opts = {}) ⇒ Result

Remove a document from the collection.

Examples:

Remove a single document from the collection.

collection_view.delete_one

Parameters:

  • opts (Hash) (defaults to: {})

    The options.

Options Hash (opts):

  • :collation (Hash)

    The collation to use.

  • :session (Session)

    The session to use.

  • :hint (Hash | String)

    The index to use for this operation. May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. “id”).

  • :write_concern (Hash)

    The write concern options. Can be :w => Integer, :fsync => Boolean, :j => Boolean.

Returns:

  • (Result)

    The response from the database.

Since:

  • 2.0.0



218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
# File 'lib/mongo/collection/view/writable.rb', line 218

def delete_one(opts = {})
  delete_doc = { Operation::Q => filter, Operation::LIMIT => 1 }
  with_session(opts) do |session|
    write_concern = if opts[:write_concern]
      WriteConcern.get(opts[:write_concern])
    else
      write_concern_with_session(session)
    end
    write_with_retry(session, write_concern) do |server, txn_num|
      apply_collation!(delete_doc, server, opts)
      apply_hint!(delete_doc, server, opts.merge(write_concern: write_concern))

      Operation::Delete.new(
          :deletes => [ delete_doc ],
          :db_name => collection.database.name,
          :coll_name => collection.name,
          :write_concern => write_concern,
          :bypass_document_validation => !!opts[:bypass_document_validation],
          :session => session,
          :txn_num => txn_num
      ).execute(server, client: client)
    end
  end
end

#find_one_and_delete(opts = {}) ⇒ BSON::Document?

Finds a single document in the database via findAndModify and deletes it, returning the original document.

Examples:

Find one document and delete it.

view.find_one_and_delete

Parameters:

  • opts (Hash) (defaults to: {})

    The options.

Options Hash (opts):

  • :max_time_ms (Integer)

    The maximum amount of time to allow the command to run in milliseconds.

  • :projection (Hash)

    The fields to include or exclude in the returned doc.

  • :sort (Hash)

    The key and direction pairs by which the result set will be sorted.

  • :collation (Hash)

    The collation to use.

  • :session (Session)

    The session to use.

  • :hint (Hash | String)

    The index to use for this operation. May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. “id”).

Returns:

  • (BSON::Document, nil)

    The document, if found.

Since:

  • 2.0.0



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/mongo/collection/view/writable.rb', line 50

def find_one_and_delete(opts = {})
  cmd = { :findAndModify => collection.name, :query => filter, :remove => true }
  cmd[:fields] = projection if projection
  cmd[:sort] = sort if sort
  cmd[:maxTimeMS] = max_time_ms if max_time_ms
  if opts[:bypass_document_validation]
    cmd[:bypassDocumentValidation] = true
  end

  with_session(opts) do |session|
    applied_write_concern = applied_write_concern(session)
    cmd[:writeConcern] = applied_write_concern.options if applied_write_concern
    write_with_retry(session, applied_write_concern) do |server, txn_num|
      apply_collation!(cmd, server, opts)
      apply_hint!(cmd, server, opts.merge(write_concern: applied_write_concern))

      Operation::Command.new(
          :selector => cmd,
          :db_name => database.name,
          :session => session,
          :txn_num => txn_num
      ).execute(server, client: client)
    end
  end.first['value']
end

#find_one_and_replace(replacement, opts = {}) ⇒ BSON::Document

Finds a single document and replaces it.

Examples:

Find a document and replace it, returning the original.

view.find_one_and_replace({ name: 'test' }, :return_document => :before)

Find a document and replace it, returning the new document.

view.find_one_and_replace({ name: 'test' }, :return_document => :after)

Parameters:

  • replacement (BSON::Document)

    The replacement.

  • opts (Hash) (defaults to: {})

    The options.

Options Hash (opts):

  • :return_document (Symbol)

    Either :before or :after.

  • :upsert (true, false)

    Whether to upsert if the document doesn’t exist.

  • :bypass_document_validation (true, false)

    Whether or not to skip document level validation.

  • :collation (Hash)

    The collation to use.

  • :hint (Hash | String)

    The index to use for this operation. May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. “id”).

Returns:

  • (BSON::Document)

    The document.

Since:

  • 2.0.0



98
99
100
# File 'lib/mongo/collection/view/writable.rb', line 98

def find_one_and_replace(replacement, opts = {})
  find_one_and_update(replacement, opts)
end

#find_one_and_update(document, opts = {}) ⇒ BSON::Document

Finds a single document and updates it.

an update should apply.

Examples:

Find a document and update it, returning the original.

view.find_one_and_update({ "$set" => { name: 'test' }}, :return_document => :before)

Parameters:

  • document (BSON::Document)

    The updates.

  • opts (Hash) (defaults to: {})

    The options.

  • options (Hash)

    a customizable set of options

Options Hash (opts):

  • :projection (Hash)

    The fields to include or exclude in the returned doc.

  • :sort (Hash)

    The key and direction pairs by which the result set will be sorted.

  • :return_document (Symbol)

    Either :before or :after.

  • :upsert (true, false)

    Whether to upsert if the document doesn’t exist.

  • :bypass_document_validation (true, false)

    Whether or not to skip document level validation.

  • :collation (Hash)

    The collation to use.

  • :array_filters (Array)

    A set of filters specifying to which array elements

  • :session (Session)

    The session to use.

  • :hint (Hash | String)

    The index to use for this operation. May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. “id”).

Returns:

  • (BSON::Document)

    The document.

Since:

  • 2.0.0



129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'lib/mongo/collection/view/writable.rb', line 129

def find_one_and_update(document, opts = {})
  cmd = { :findAndModify => collection.name, :query => filter }
  cmd[:update] = document
  cmd[:fields] = projection if projection
  cmd[:sort] = sort if sort
  cmd[:new] = !!(opts[:return_document] && opts[:return_document] == :after)
  cmd[:upsert] = opts[:upsert] if opts[:upsert]
  cmd[:maxTimeMS] = max_time_ms if max_time_ms
  if opts[:bypass_document_validation]
    cmd[:bypassDocumentValidation] = true
  end

  value = with_session(opts) do |session|
    applied_write_concern = applied_write_concern(opts[:session])
    cmd[:writeConcern] = applied_write_concern.options if applied_write_concern
    write_with_retry(session, applied_write_concern) do |server, txn_num|
      apply_collation!(cmd, server, opts)
      apply_array_filters!(cmd, server, opts)
      apply_hint!(cmd, server, opts.merge(write_concern: applied_write_concern))

      Operation::Command.new(
          :selector => cmd,
          :db_name => database.name,
          :session => session,
          :txn_num => txn_num
      ).execute(server, client: client)
    end
  end.first['value']
  value unless value.nil? || value.empty?
end

#replace_one(replacement, opts = {}) ⇒ Result

Replaces a single document in the database with the new document.

Examples:

Replace a single document.

collection_view.replace_one({ name: 'test' })

Parameters:

  • replacement (Hash)

    The replacement document.

  • opts (Hash) (defaults to: {})

    The options.

Options Hash (opts):

  • :upsert (true, false)

    Whether to upsert if the document doesn’t exist.

  • :bypass_document_validation (true, false)

    Whether or not to skip document level validation.

  • :collation (Hash)

    The collation to use.

  • :session (Session)

    The session to use.

  • :hint (Hash | String)

    The index to use for this operation. May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. “id”).

  • :write_concern (Hash)

    The write concern options. Can be :w => Integer, :fsync => Boolean, :j => Boolean.

Returns:

  • (Result)

    The response from the database.

Since:

  • 2.0.0



265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
# File 'lib/mongo/collection/view/writable.rb', line 265

def replace_one(replacement, opts = {})
  update_doc = { Operation::Q => filter,
                 Operation::U => replacement,
                }
  if opts[:upsert]
    update_doc['upsert'] = true
  end
  with_session(opts) do |session|
    write_concern = if opts[:write_concern]
      WriteConcern.get(opts[:write_concern])
    else
      write_concern_with_session(session)
    end

    write_with_retry(session, write_concern) do |server, txn_num|
      apply_collation!(update_doc, server, opts)
      apply_array_filters!(update_doc, server, opts)
      apply_hint!(update_doc, server, opts.merge(write_concern: write_concern))

      Operation::Update.new(
          :updates => [ update_doc ],
          :db_name => collection.database.name,
          :coll_name => collection.name,
          :write_concern => write_concern,
          :bypass_document_validation => !!opts[:bypass_document_validation],
          :session => session,
          :txn_num => txn_num
      ).execute(server, client: client)
    end
  end
end

#update_many(spec, opts = {}) ⇒ Result

Update documents in the collection.

Examples:

Update multiple documents in the collection.

collection_view.update_many('$set' => { name: 'test' })

Parameters:

  • spec (Hash | Array<Hash>)

    The update document or pipeline.

  • opts (Hash) (defaults to: {})

    The options.

Options Hash (opts):

  • :upsert (true, false)

    Whether to upsert if the document doesn’t exist.

  • :bypass_document_validation (true, false)

    Whether or not to skip document level validation.

  • :collation (Hash)

    The collation to use.

  • :array_filters (Array)

    A set of filters specifying to which array elements an update should apply.

  • :session (Session)

    The session to use.

  • :hint (Hash | String)

    The index to use for this operation. May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. “id”).

  • :write_concern (Hash)

    The write concern options. Can be :w => Integer, :fsync => Boolean, :j => Boolean.

Returns:

  • (Result)

    The response from the database.

Since:

  • 2.0.0



321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
# File 'lib/mongo/collection/view/writable.rb', line 321

def update_many(spec, opts = {})
  update_doc = { Operation::Q => filter,
                 Operation::U => spec,
                 Operation::MULTI => true,
                 }
  if opts[:upsert]
    update_doc['upsert'] = true
  end
  with_session(opts) do |session|
    write_concern = if opts[:write_concern]
      WriteConcern.get(opts[:write_concern])
    else
      write_concern_with_session(session)
    end
    nro_write_with_retry(session, write_concern) do |server|
      apply_collation!(update_doc, server, opts)
      apply_array_filters!(update_doc, server, opts)
      apply_hint!(update_doc, server, opts.merge(write_concern: write_concern))

      Operation::Update.new(
          :updates => [ update_doc ],
          :db_name => collection.database.name,
          :coll_name => collection.name,
          :write_concern => write_concern,
          :bypass_document_validation => !!opts[:bypass_document_validation],
          :session => session
      ).execute(server, client: client)
    end
  end
end

#update_one(spec, opts = {}) ⇒ Result

Update a single document in the collection.

Examples:

Update a single document in the collection.

collection_view.update_one('$set' => { name: 'test' })

Parameters:

  • spec (Hash | Array<Hash>)

    The update document or pipeline.

  • opts (Hash) (defaults to: {})

    The options.

Options Hash (opts):

  • :upsert (true, false)

    Whether to upsert if the document doesn’t exist.

  • :bypass_document_validation (true, false)

    Whether or not to skip document level validation.

  • :collation (Hash)

    The collation to use.

  • :array_filters (Array)

    A set of filters specifying to which array elements an update should apply.

  • :session (Session)

    The session to use.

  • :hint (Hash | String)

    The index to use for this operation. May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. “id”).

  • :write_concern (Hash)

    The write concern options. Can be :w => Integer, :fsync => Boolean, :j => Boolean.

Returns:

  • (Result)

    The response from the database.

Since:

  • 2.0.0



376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
# File 'lib/mongo/collection/view/writable.rb', line 376

def update_one(spec, opts = {})
  update_doc = { Operation::Q => filter,
                 Operation::U => spec,
                 }
  if opts[:upsert]
    update_doc['upsert'] = true
  end
  with_session(opts) do |session|
    write_concern = if opts[:write_concern]
      WriteConcern.get(opts[:write_concern])
    else
      write_concern_with_session(session)
    end
    write_with_retry(session, write_concern) do |server, txn_num|
      apply_collation!(update_doc, server, opts)
      apply_array_filters!(update_doc, server, opts)
      apply_hint!(update_doc, server, opts.merge(write_concern: write_concern))

      Operation::Update.new(
          :updates => [ update_doc ],
          :db_name => collection.database.name,
          :coll_name => collection.name,
          :write_concern => write_concern,
          :bypass_document_validation => !!opts[:bypass_document_validation],
          :session => session,
          :txn_num => txn_num
      ).execute(server, client: client)
    end
  end
end