Class: Moped::Query
Overview
The Query
class encapsulates all of the logic related to building selectors for querying, updating, or removing documents in a collection.
Instance Attribute Summary collapse
-
#collection ⇒ Object
readonly
Returns the value of attribute collection.
- #collection The collection to execute the query on.(Thecollectiontoexecutethequeryon.) ⇒ Object readonly
-
#operation ⇒ Object
readonly
Returns the value of attribute operation.
- #operation The query operation.(Thequeryoperation.) ⇒ Object readonly
-
#selector ⇒ Object
readonly
Returns the value of attribute selector.
- #selector The query selector.(Thequeryselector.) ⇒ Object readonly
Instance Method Summary collapse
-
#count ⇒ Integer
Get the count of matching documents in the query.
-
#distinct(key) ⇒ Array<Object ] The distinct values.
Get the distinct values in the collection for the provided key.
-
#each {|document| ... } ⇒ Enumerator
Iterate through documents matching the query’s selector.
-
#explain ⇒ Hash
Explain the current query.
-
#first ⇒ Hash
(also: #one)
Get the first matching document.
-
#hint(hint) ⇒ Query
Apply an index hint to the query.
-
#initialize(collection, selector) ⇒ Query
constructor
Initialize the query.
-
#limit(limit) ⇒ Query
Set the query’s limit.
-
#modify(change, options = {}) ⇒ Hash
Execute a $findAndModify on the query.
-
#remove ⇒ Hash?
Remove a single document matching the query’s selector.
-
#remove_all ⇒ Hash?
Remove multiple documents matching the query’s selector.
-
#select(select) ⇒ Query
Set the fields to include or exclude from the query.
-
#skip(skip) ⇒ Query
Set the number of documents to skip.
-
#sort(sort) ⇒ Query
Set the sort order for the query.
-
#update(change, flags = nil) ⇒ Hash?
Update a single document matching the query’s selector.
-
#update_all(change) ⇒ Hash?
Update multiple documents matching the query’s selector.
-
#upsert(change) ⇒ Hash?
Update an existing document with
change
, otherwise create one.
Constructor Details
#initialize(collection, selector) ⇒ Query
Initialize the query.
151 152 153 154 155 156 157 158 |
# File 'lib/moped/query.rb', line 151 def initialize(collection, selector) @collection, @selector = collection, selector @operation = Protocol::Query.new( collection.database.name, collection.name, selector ) end |
Instance Attribute Details
#collection ⇒ Object (readonly)
Returns the value of attribute collection.
25 26 27 |
# File 'lib/moped/query.rb', line 25 def collection @collection end |
#collection The collection to execute the query on.(Thecollectiontoexecutethequeryon.) ⇒ Object (readonly)
25 |
# File 'lib/moped/query.rb', line 25 attr_reader :collection, :operation, :selector |
#operation ⇒ Object (readonly)
Returns the value of attribute operation.
25 26 27 |
# File 'lib/moped/query.rb', line 25 def operation @operation end |
#operation The query operation.(Thequeryoperation.) ⇒ Object (readonly)
25 |
# File 'lib/moped/query.rb', line 25 attr_reader :collection, :operation, :selector |
#selector ⇒ Object (readonly)
Returns the value of attribute selector.
25 26 27 |
# File 'lib/moped/query.rb', line 25 def selector @selector end |
#selector The query selector.(Thequeryselector.) ⇒ Object (readonly)
25 |
# File 'lib/moped/query.rb', line 25 attr_reader :collection, :operation, :selector |
Instance Method Details
#count ⇒ Integer
Get the count of matching documents in the query.
35 36 37 38 39 40 41 |
# File 'lib/moped/query.rb', line 35 def count result = collection.database.command( count: collection.name, query: selector ) result["n"].to_i end |
#distinct(key) ⇒ Array<Object ] The distinct values.
Get the distinct values in the collection for the provided key.
53 54 55 56 57 58 59 60 |
# File 'lib/moped/query.rb', line 53 def distinct(key) result = collection.database.command( distinct: collection.name, key: key.to_s, query: selector ) result["values"] end |
#each {|document| ... } ⇒ Enumerator
Iterate through documents matching the query’s selector.
74 75 76 77 78 79 80 81 |
# File 'lib/moped/query.rb', line 74 def each cursor = Cursor.new(session, operation) enum = cursor.to_enum enum.each do |document| yield document end if block_given? enum end |
#explain ⇒ Hash
Explain the current query.
91 92 93 94 95 96 97 98 99 100 101 102 |
# File 'lib/moped/query.rb', line 91 def explain explanation = operation.selector.dup hint = explanation["$hint"] sort = explanation["$orderby"] explanation = { "$query" => selector, "$explain" => true, } explanation["$orderby"] = sort if sort explanation["$hint"] = hint if hint Query.new(collection, explanation).limit(-(operation.limit.abs)).each { |doc| return doc } end |
#first ⇒ Hash Also known as: one
Get the first matching document.
112 113 114 115 116 117 118 119 120 121 122 123 |
# File 'lib/moped/query.rb', line 112 def first reply = session.context.query( operation.database, operation.collection, operation.selector, fields: operation.fields, flags: operation.flags, skip: operation.skip, limit: -1 ) reply.documents.first end |
#hint(hint) ⇒ Query
Apply an index hint to the query.
136 137 138 139 140 |
# File 'lib/moped/query.rb', line 136 def hint(hint) operation.selector = { "$query" => selector } unless operation.selector["$query"] operation.selector["$hint"] = hint self end |
#limit(limit) ⇒ Query
Set the query’s limit.
170 171 172 173 |
# File 'lib/moped/query.rb', line 170 def limit(limit) operation.limit = limit self end |
#modify(change, options = {}) ⇒ Hash
Execute a $findAndModify on the query.
199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 |
# File 'lib/moped/query.rb', line 199 def modify(change, = {}) command = { findAndModify: collection.name, query: selector }.merge() command[:sort] = operation.selector["$orderby"] if operation.selector["$orderby"] command[:fields] = operation.fields if operation.fields command[:update] = change unless [:remove] result = session.with(consistency: :strong) do |sess| sess.command(command)["value"] end # Keeping moped compatibility with mongodb >= 2.2.0-rc0 [:upsert] && !result ? [] : result end |
#remove ⇒ Hash?
Remove a single document matching the query’s selector.
225 226 227 228 229 230 231 232 233 234 |
# File 'lib/moped/query.rb', line 225 def remove session.with(consistency: :strong) do |session| session.context.remove( operation.database, operation.collection, operation.selector, flags: [ :remove_first ] ) end end |
#remove_all ⇒ Hash?
Remove multiple documents matching the query’s selector.
244 245 246 247 248 249 250 251 252 |
# File 'lib/moped/query.rb', line 244 def remove_all session.with(consistency: :strong) do |session| session.context.remove( operation.database, operation.collection, operation.selector ) end end |
#select(select) ⇒ Query
Set the fields to include or exclude from the query.
264 265 266 267 |
# File 'lib/moped/query.rb', line 264 def select(select) operation.fields = select self end |
#skip(skip) ⇒ Query
Set the number of documents to skip.
279 280 281 282 |
# File 'lib/moped/query.rb', line 279 def skip(skip) operation.skip = skip self end |
#sort(sort) ⇒ Query
Set the sort order for the query.
294 295 296 297 |
# File 'lib/moped/query.rb', line 294 def sort(sort) operation.selector = { "$query" => selector, "$orderby" => sort } self end |
#update(change, flags = nil) ⇒ Hash?
Update a single document matching the query’s selector.
311 312 313 314 315 316 317 318 319 320 321 |
# File 'lib/moped/query.rb', line 311 def update(change, flags = nil) session.with(consistency: :strong) do |session| session.context.update( operation.database, operation.collection, operation.selector["$query"] || operation.selector, change, flags: flags ) end end |
#update_all(change) ⇒ Hash?
Update multiple documents matching the query’s selector.
333 334 335 |
# File 'lib/moped/query.rb', line 333 def update_all(change) update(change, [ :multi ]) end |
#upsert(change) ⇒ Hash?
Update an existing document with change
, otherwise create one.
351 352 353 |
# File 'lib/moped/query.rb', line 351 def upsert(change) update(change, [ :upsert ]) end |