Class: Moneta::Adapters::MongoOfficial

Inherits:
MongoBase
  • Object
show all
Defined in:
lib/moneta/adapters/mongo/official.rb

Overview

MongoDB backend

Supports expiration, documents will be automatically removed starting with mongodb >= 2.2 (see /).

You can store hashes directly using this adapter.

Examples:

Store hashes

db = Moneta::Adapters::MongoOfficial.new
db['key'] = {a: 1, b: 2}

Constant Summary

Constants inherited from MongoBase

Moneta::Adapters::MongoBase::DEFAULT_PORT

Instance Attribute Summary

Attributes inherited from MongoBase

#backend

Attributes included from ExpiresSupport

#default_expires

Instance Method Summary collapse

Methods included from Defaults

#[], #[]=, #decrement, #features, #fetch, included, #key?, #supports?

Methods included from OptionSupport

#expires, #prefix, #raw, #with

Constructor Details

#initialize(options = {}) ⇒ MongoOfficial

Returns a new instance of MongoOfficial.

Parameters:

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

Options Hash (options):

  • :collection (String) — default: 'moneta'

    MongoDB collection name

  • :host (String) — default: '127.0.0.1'

    MongoDB server host

  • :user (String)

    Username used to authenticate

  • :password (String)

    Password used to authenticate

  • :port (Integer) — default: MongoDB default port

    MongoDB server port

  • :db (String) — default: 'moneta'

    MongoDB database

  • :expires (Integer)

    Default expiration time

  • :expires_field (String) — default: 'expiresAt'

    Document field to store expiration time

  • :value_field (String) — default: 'value'

    Document field to store value

  • :type_field (String) — default: 'type'

    Document field to store value type

  • :backend (::Mongo::Client)

    Use existing backend instance

  • Other (Object)

    options passed to ‘Mongo::MongoClient#new`



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/moneta/adapters/mongo/official.rb', line 32

def initialize(options = {})
  super(options)
  collection = options.delete(:collection) || 'moneta'
  db = options.delete(:db) || 'moneta'
  @backend = options[:backend] ||
    begin
      host = options.delete(:host) || '127.0.0.1'
      port = options.delete(:port) || DEFAULT_PORT
      options[:logger] ||= ::Logger.new(STDERR).tap do |logger|
        logger.level = ::Logger::ERROR
      end
      ::Mongo::Client.new(["#{host}:#{port}"], options)
    end
  @backend.use(db)
  @collection = @backend[collection]
  if @backend.command(buildinfo: 1).documents.first['version'] >= '2.2'
    @collection.indexes.create_one({@expires_field => 1}, expire_after: 0)
  else
    warn 'Moneta::Adapters::Mongo - You are using MongoDB version < 2.2, expired documents will not be deleted'
  end
end

Instance Method Details

#clear(options = {}) ⇒ void

This method returns an undefined value.

Clear all keys in this store

Parameters:

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


105
106
107
108
# File 'lib/moneta/adapters/mongo/official.rb', line 105

def clear(options = {})
  @collection.delete_many
  self
end

#closeObject

Explicitly close the store

Returns:

  • nil



111
112
113
114
# File 'lib/moneta/adapters/mongo/official.rb', line 111

def close
  @backend.close
  nil
end

#create(key, value, options = {}) ⇒ Boolean

Note:

Not every Moneta store implements this method, a NotImplementedError is raised if it is not supported.

Atomically sets a key to value if it’s not set.

Parameters:

  • key (Object)
  • value (Object)
  • options (Hash) (defaults to: {})

Options Hash (options):

  • :expires (Integer)

    Update expiration time (See Expires)

  • :raw (Boolean)

    Raw access without value transformation (See Transformer)

  • :prefix (String)

    Prefix key (See Transformer)

Returns:

  • (Boolean)

    key was set



95
96
97
98
99
100
101
102
# File 'lib/moneta/adapters/mongo/official.rb', line 95

def create(key, value, options = {})
  key = to_binary(key)
  @collection.insert_one(value_to_doc(key, value, options))
  true
rescue ::Mongo::Error::OperationFailure => ex
  raise unless ex.message =~ /^E11000 / # duplicate key error
  false
end

#delete(key, options = {}) ⇒ Object

Delete the key from the store and return the current value

Parameters:

  • key (Object)
  • options (Hash) (defaults to: {})

Options Hash (options):

  • :raw (Boolean)

    Raw access without value transformation (See Transformer)

  • :prefix (String)

    Prefix key (See Transformer)

  • Other (Object)

    options as defined by the adapters or middleware

Returns:

  • (Object)

    current value



77
78
79
80
81
82
83
84
# File 'lib/moneta/adapters/mongo/official.rb', line 77

def delete(key, options = {})
  key = to_binary(key)
  if doc = @collection.find(_id: key).find_one_and_delete and
    !doc[@expires_field] || doc[@expires_field] >= Time.now
  then
    doc_to_value(doc)
  end
end

#increment(key, amount = 1, options = {}) ⇒ Object

Note:

Not every Moneta store implements this method, a NotImplementedError is raised if it is not supported.

Atomically increment integer value with key

This method also accepts negative amounts.

Parameters:

  • key (Object)
  • amount (Integer) (defaults to: 1)
  • options (Hash) (defaults to: {})

Options Hash (options):

  • :prefix (String)

    Prefix key (See Transformer)

  • Other (Object)

    options as defined by the adapters or middleware

Returns:

  • (Object)

    value from store



87
88
89
90
91
92
# File 'lib/moneta/adapters/mongo/official.rb', line 87

def increment(key, amount = 1, options = {})
  @collection.find_one_and_update({ _id: to_binary(key) },
                                  { '$inc' => { @value_field => amount } },
                                  :return_document => :after,
                                  :upsert => true)[@value_field]
end

#load(key, options = {}) ⇒ Object

Fetch value with key. Return nil if the key doesn’t exist

Parameters:

  • key (Object)
  • options (Hash) (defaults to: {})

Options Hash (options):

  • :expires (Integer)

    Update expiration time (See Expires)

  • :raw (Boolean)

    Raw access without value transformation (See Transformer)

  • :prefix (String)

    Prefix key (See Transformer)

  • :sync (Boolean)

    Synchronized load (Cache reloads from adapter, Daybreak syncs with file)

  • Other (Object)

    options as defined by the adapters or middleware

Returns:

  • (Object)

    value



55
56
57
58
59
60
61
62
63
64
65
# File 'lib/moneta/adapters/mongo/official.rb', line 55

def load(key, options = {})
  key = to_binary(key)
  doc = @collection.find(_id: key).limit(1).first
  if doc && (!doc[@expires_field] || doc[@expires_field] >= Time.now)
    expires = expires_at(options, nil)
    # @expires_field must be a Time object (BSON date datatype)
    @collection.update_one({ _id: key },
                           '$set' => { @expires_field => expires }) unless expires.nil?
    doc_to_value(doc)
  end
end

#store(key, value, options = {}) ⇒ Object

Store value with key

Parameters:

  • key (Object)
  • value (Object)
  • options (Hash) (defaults to: {})

Options Hash (options):

  • :expires (Integer)

    Set expiration time (See Expires)

  • :raw (Boolean)

    Raw access without value transformation (See Transformer)

  • :prefix (String)

    Prefix key (See Transformer)

  • Other (Object)

    options as defined by the adapters or middleware

Returns:

  • value



68
69
70
71
72
73
74
# File 'lib/moneta/adapters/mongo/official.rb', line 68

def store(key, value, options = {})
  key = to_binary(key)
  @collection.replace_one({ _id: key },
                          value_to_doc(key, value, options),
                          upsert: true)
  value
end