mongoid 7.5.2 → 8.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (292) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +3 -3
  4. data/lib/config/locales/en.yml +46 -30
  5. data/lib/mongoid/association/accessors.rb +32 -3
  6. data/lib/mongoid/association/bindable.rb +48 -0
  7. data/lib/mongoid/association/builders.rb +4 -2
  8. data/lib/mongoid/association/eager_loadable.rb +29 -7
  9. data/lib/mongoid/association/embedded/batchable.rb +48 -8
  10. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  11. data/lib/mongoid/association/embedded/embedded_in.rb +2 -1
  12. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  13. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
  14. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +40 -18
  15. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
  16. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +21 -2
  17. data/lib/mongoid/association/macros.rb +2 -1
  18. data/lib/mongoid/association/many.rb +5 -0
  19. data/lib/mongoid/association/nested/many.rb +2 -1
  20. data/lib/mongoid/association/proxy.rb +12 -0
  21. data/lib/mongoid/association/referenced/auto_save.rb +3 -2
  22. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  23. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  24. data/lib/mongoid/association/referenced/belongs_to.rb +1 -1
  25. data/lib/mongoid/association/referenced/counter_cache.rb +8 -8
  26. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +64 -11
  27. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +4 -1
  28. data/lib/mongoid/association/referenced/has_many/enumerable.rb +10 -18
  29. data/lib/mongoid/association/referenced/has_many/proxy.rb +12 -9
  30. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  31. data/lib/mongoid/association/referenced/has_one/proxy.rb +8 -11
  32. data/lib/mongoid/association/referenced/syncable.rb +2 -2
  33. data/lib/mongoid/association/relatable.rb +38 -4
  34. data/lib/mongoid/atomic/paths/embedded/many.rb +19 -0
  35. data/lib/mongoid/attributes/processing.rb +9 -2
  36. data/lib/mongoid/attributes.rb +30 -27
  37. data/lib/mongoid/cacheable.rb +2 -2
  38. data/lib/mongoid/changeable.rb +37 -2
  39. data/lib/mongoid/clients/options.rb +4 -0
  40. data/lib/mongoid/clients/sessions.rb +2 -14
  41. data/lib/mongoid/config.rb +15 -11
  42. data/lib/mongoid/contextual/aggregable/memory.rb +23 -15
  43. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  44. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  45. data/lib/mongoid/contextual/memory.rb +55 -28
  46. data/lib/mongoid/contextual/mongo.rb +173 -245
  47. data/lib/mongoid/contextual/none.rb +33 -15
  48. data/lib/mongoid/copyable.rb +32 -8
  49. data/lib/mongoid/criteria/includable.rb +24 -20
  50. data/lib/mongoid/criteria/marshalable.rb +10 -2
  51. data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -15
  52. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  53. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -1
  54. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  55. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  56. data/lib/mongoid/criteria/queryable/extensions/hash.rb +0 -16
  57. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
  58. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  59. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  60. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +1 -1
  61. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -1
  62. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  63. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  64. data/lib/mongoid/criteria/queryable/optional.rb +3 -9
  65. data/lib/mongoid/criteria/queryable/options.rb +1 -1
  66. data/lib/mongoid/criteria/queryable/selectable.rb +2 -24
  67. data/lib/mongoid/criteria/queryable/selector.rb +89 -4
  68. data/lib/mongoid/criteria/queryable/smash.rb +39 -6
  69. data/lib/mongoid/criteria/queryable.rb +11 -6
  70. data/lib/mongoid/criteria.rb +1 -28
  71. data/lib/mongoid/deprecable.rb +36 -0
  72. data/lib/mongoid/deprecation.rb +25 -0
  73. data/lib/mongoid/document.rb +88 -33
  74. data/lib/mongoid/equality.rb +4 -4
  75. data/lib/mongoid/errors/document_not_found.rb +6 -2
  76. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  77. data/lib/mongoid/errors/invalid_field.rb +5 -1
  78. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  79. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  80. data/lib/mongoid/errors.rb +2 -2
  81. data/lib/mongoid/extensions/array.rb +8 -6
  82. data/lib/mongoid/extensions/big_decimal.rb +29 -10
  83. data/lib/mongoid/extensions/binary.rb +42 -0
  84. data/lib/mongoid/extensions/boolean.rb +8 -2
  85. data/lib/mongoid/extensions/date.rb +26 -20
  86. data/lib/mongoid/extensions/date_time.rb +1 -1
  87. data/lib/mongoid/extensions/float.rb +4 -5
  88. data/lib/mongoid/extensions/hash.rb +12 -5
  89. data/lib/mongoid/extensions/integer.rb +4 -5
  90. data/lib/mongoid/extensions/object.rb +2 -0
  91. data/lib/mongoid/extensions/range.rb +41 -10
  92. data/lib/mongoid/extensions/regexp.rb +11 -4
  93. data/lib/mongoid/extensions/set.rb +11 -4
  94. data/lib/mongoid/extensions/string.rb +2 -13
  95. data/lib/mongoid/extensions/symbol.rb +3 -14
  96. data/lib/mongoid/extensions/time.rb +27 -16
  97. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  98. data/lib/mongoid/extensions.rb +1 -0
  99. data/lib/mongoid/factory.rb +42 -7
  100. data/lib/mongoid/fields/foreign_key.rb +7 -0
  101. data/lib/mongoid/fields/validators/macro.rb +3 -9
  102. data/lib/mongoid/fields.rb +49 -7
  103. data/lib/mongoid/findable.rb +21 -16
  104. data/lib/mongoid/indexable/specification.rb +1 -1
  105. data/lib/mongoid/indexable/validators/options.rb +4 -1
  106. data/lib/mongoid/interceptable.rb +69 -9
  107. data/lib/mongoid/persistable/creatable.rb +14 -5
  108. data/lib/mongoid/persistable/updatable.rb +12 -5
  109. data/lib/mongoid/persistence_context.rb +8 -42
  110. data/lib/mongoid/query_cache.rb +6 -258
  111. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  112. data/lib/mongoid/reloadable.rb +7 -3
  113. data/lib/mongoid/scopable.rb +9 -11
  114. data/lib/mongoid/selectable.rb +1 -2
  115. data/lib/mongoid/stateful.rb +27 -1
  116. data/lib/mongoid/timestamps/created.rb +1 -1
  117. data/lib/mongoid/timestamps/updated.rb +1 -1
  118. data/lib/mongoid/touchable.rb +2 -3
  119. data/lib/mongoid/traversable.rb +1 -0
  120. data/lib/mongoid/validatable/uniqueness.rb +2 -1
  121. data/lib/mongoid/version.rb +1 -1
  122. data/lib/mongoid/warnings.rb +3 -4
  123. data/lib/mongoid.rb +1 -0
  124. data/spec/config/mongoid.yml +16 -0
  125. data/spec/integration/app_spec.rb +8 -12
  126. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  127. data/spec/integration/associations/embedded_spec.rb +15 -0
  128. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  129. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  130. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  131. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  132. data/spec/integration/associations/has_one_spec.rb +97 -1
  133. data/spec/integration/associations/scope_option_spec.rb +1 -1
  134. data/spec/integration/callbacks_models.rb +95 -1
  135. data/spec/integration/callbacks_spec.rb +226 -4
  136. data/spec/integration/criteria/range_spec.rb +95 -1
  137. data/spec/integration/discriminator_key_spec.rb +115 -76
  138. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  139. data/spec/integration/i18n_fallbacks_spec.rb +1 -15
  140. data/spec/integration/matcher_examples_spec.rb +20 -13
  141. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  142. data/spec/integration/matcher_operator_spec.rb +3 -5
  143. data/spec/integration/persistence/range_field_spec.rb +350 -0
  144. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  145. data/spec/mongoid/association/depending_spec.rb +9 -9
  146. data/spec/mongoid/association/eager_spec.rb +2 -1
  147. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  148. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  149. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
  150. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  151. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +219 -8
  152. data/spec/mongoid/association/embedded/embeds_many_models.rb +157 -0
  153. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  154. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  155. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  156. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  157. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  158. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  159. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  160. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  161. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  162. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
  163. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +38 -5
  164. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  165. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  166. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  167. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  168. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +62 -13
  169. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  170. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  171. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  172. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  173. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  174. data/spec/mongoid/association/syncable_spec.rb +14 -0
  175. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  176. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  177. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  178. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  179. data/spec/mongoid/attributes_spec.rb +480 -27
  180. data/spec/mongoid/cacheable_spec.rb +3 -3
  181. data/spec/mongoid/changeable_spec.rb +130 -13
  182. data/spec/mongoid/clients/factory_spec.rb +23 -30
  183. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  184. data/spec/mongoid/clients_spec.rb +2 -2
  185. data/spec/mongoid/config_spec.rb +52 -14
  186. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  187. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  188. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  189. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  190. data/spec/mongoid/contextual/memory_spec.rb +521 -14
  191. data/spec/mongoid/contextual/mongo_spec.rb +564 -394
  192. data/spec/mongoid/contextual/none_spec.rb +11 -19
  193. data/spec/mongoid/copyable_spec.rb +451 -1
  194. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  195. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  196. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  197. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  198. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  199. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  200. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  201. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  202. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  203. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  204. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  205. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  206. data/spec/mongoid/criteria/queryable/optional_spec.rb +0 -484
  207. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -0
  208. data/spec/mongoid/criteria/queryable/selectable_spec.rb +77 -85
  209. data/spec/mongoid/criteria/queryable/selector_spec.rb +14 -2
  210. data/spec/mongoid/criteria_spec.rb +469 -1201
  211. data/spec/mongoid/document_fields_spec.rb +173 -24
  212. data/spec/mongoid/document_spec.rb +32 -41
  213. data/spec/mongoid/equality_spec.rb +12 -12
  214. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  215. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  216. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  217. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  218. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  219. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  220. data/spec/mongoid/extensions/array_spec.rb +16 -2
  221. data/spec/mongoid/extensions/big_decimal_spec.rb +697 -212
  222. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  223. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  224. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  225. data/spec/mongoid/extensions/date_spec.rb +71 -1
  226. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  227. data/spec/mongoid/extensions/float_spec.rb +48 -76
  228. data/spec/mongoid/extensions/hash_spec.rb +30 -0
  229. data/spec/mongoid/extensions/integer_spec.rb +45 -66
  230. data/spec/mongoid/extensions/range_spec.rb +255 -54
  231. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  232. data/spec/mongoid/extensions/set_spec.rb +106 -0
  233. data/spec/mongoid/extensions/string_spec.rb +53 -25
  234. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  235. data/spec/mongoid/extensions/time_spec.rb +634 -66
  236. data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
  237. data/spec/mongoid/factory_spec.rb +61 -1
  238. data/spec/mongoid/fields_spec.rb +321 -50
  239. data/spec/mongoid/findable_spec.rb +64 -29
  240. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  241. data/spec/mongoid/indexable_spec.rb +16 -19
  242. data/spec/mongoid/interceptable_spec.rb +584 -5
  243. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  244. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  245. data/spec/mongoid/mongoizable_spec.rb +285 -0
  246. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  247. data/spec/mongoid/persistable/deletable_spec.rb +2 -2
  248. data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
  249. data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
  250. data/spec/mongoid/persistence_context_spec.rb +24 -0
  251. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  252. data/spec/mongoid/query_cache_spec.rb +0 -154
  253. data/spec/mongoid/reloadable_spec.rb +35 -2
  254. data/spec/mongoid/scopable_spec.rb +36 -34
  255. data/spec/mongoid/shardable_spec.rb +14 -0
  256. data/spec/mongoid/stateful_spec.rb +28 -0
  257. data/spec/mongoid/timestamps_spec.rb +390 -0
  258. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  259. data/spec/mongoid/touchable_spec.rb +116 -0
  260. data/spec/mongoid/touchable_spec_models.rb +12 -8
  261. data/spec/mongoid/traversable_spec.rb +4 -11
  262. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  263. data/spec/mongoid/validatable/uniqueness_spec.rb +60 -31
  264. data/spec/mongoid/warnings_spec.rb +35 -0
  265. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  266. data/spec/rails/mongoid_spec.rb +4 -16
  267. data/spec/shared/lib/mrss/docker_runner.rb +0 -4
  268. data/spec/shared/lib/mrss/event_subscriber.rb +5 -15
  269. data/spec/support/constraints.rb +24 -0
  270. data/spec/support/macros.rb +30 -0
  271. data/spec/support/models/augmentation.rb +12 -0
  272. data/spec/support/models/band.rb +3 -0
  273. data/spec/support/models/catalog.rb +24 -0
  274. data/spec/support/models/circus.rb +3 -0
  275. data/spec/support/models/fanatic.rb +8 -0
  276. data/spec/support/models/implant.rb +9 -0
  277. data/spec/support/models/label.rb +2 -0
  278. data/spec/support/models/passport.rb +9 -0
  279. data/spec/support/models/person.rb +1 -0
  280. data/spec/support/models/player.rb +2 -0
  281. data/spec/support/models/powerup.rb +12 -0
  282. data/spec/support/models/registry.rb +1 -0
  283. data/spec/support/models/school.rb +14 -0
  284. data/spec/support/models/shield.rb +18 -0
  285. data/spec/support/models/student.rb +14 -0
  286. data/spec/support/models/weapon.rb +12 -0
  287. data.tar.gz.sig +0 -0
  288. metadata +667 -631
  289. metadata.gz.sig +0 -0
  290. data/lib/mongoid/errors/eager_load.rb +0 -23
  291. data/lib/mongoid/errors/invalid_value.rb +0 -17
  292. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
@@ -74,7 +74,7 @@ module Mongoid
74
74
  # @example Get the distinct values.
75
75
  # context.distinct(:name)
76
76
  #
77
- # @param [ String, Symbol ] field The name of the field.
77
+ # @param [ String | Symbol ] field The name of the field.
78
78
  #
79
79
  # @return [ Array<Object> ] The distinct values for the field.
80
80
  def distinct(field)
@@ -112,7 +112,7 @@ module Mongoid
112
112
  #
113
113
  # @return [ true, false ] If the count is more than zero.
114
114
  def exists?
115
- count > 0
115
+ any?
116
116
  end
117
117
 
118
118
  # Get the first document in the database for the criteria's selector.
@@ -120,15 +120,14 @@ module Mongoid
120
120
  # @example Get the first document.
121
121
  # context.first
122
122
  #
123
- # @param [ Integer | Hash ] limit_or_opts The number of documents to
124
- # return, or a hash of options.
123
+ # @param [ Integer ] limit The number of documents to return.
125
124
  #
126
125
  # @return [ Document ] The first document.
127
- def first(limit_or_opts = nil)
128
- if limit_or_opts.nil? || limit_or_opts.is_a?(Hash)
129
- eager_load([documents.first]).first
126
+ def first(limit = nil)
127
+ if limit
128
+ eager_load(documents.first(limit))
130
129
  else
131
- eager_load(documents.first(limit_or_opts))
130
+ eager_load([documents.first]).first
132
131
  end
133
132
  end
134
133
  alias :one :first
@@ -170,18 +169,14 @@ module Mongoid
170
169
  # @example Get the last document.
171
170
  # context.last
172
171
  #
173
- # @param [ Integer | Hash ] limit_or_opts The number of documents to
174
- # return, or a hash of options.
175
- #
176
- # @option limit_or_opts [ :none ] :id_sort This option is deprecated.
177
- # Don't apply a sort on _id if no other sort is defined on the criteria.
172
+ # @param [ Integer ] limit The number of documents to return.
178
173
  #
179
174
  # @return [ Document ] The last document.
180
- def last(limit_or_opts = nil)
181
- if limit_or_opts.nil? || limit_or_opts.is_a?(Hash)
182
- eager_load([documents.last]).first
175
+ def last(limit = nil)
176
+ if limit
177
+ eager_load(documents.last(limit))
183
178
  else
184
- eager_load(documents.last(limit_or_opts))
179
+ eager_load([documents.last]).first
185
180
  end
186
181
  end
187
182
 
@@ -236,28 +231,44 @@ module Mongoid
236
231
  #
237
232
  # @param [ Integer ] value The number of documents to return.
238
233
  #
239
- # @return [ Mongo ] The context.
234
+ # @return [ Memory ] The context.
240
235
  def limit(value)
241
236
  self.limiting = value
242
237
  self
243
238
  end
244
239
 
240
+ # Pluck the field values in memory.
241
+ #
242
+ # @example Get the values in memory.
243
+ # context.pluck(:name)
244
+ #
245
+ # @param [ String | Symbol ] *fields Field(s) to pluck.
246
+ #
247
+ # @return [ Array ] The array of plucked values.
245
248
  def pluck(*fields)
246
249
  if Mongoid.legacy_pluck_distinct
247
250
  documents.pluck(*fields)
248
251
  else
249
- documents.map do |d|
250
- if fields.length == 1
251
- retrieve_value_at_path(d, fields.first)
252
- else
253
- fields.map do |field|
254
- retrieve_value_at_path(d, field)
255
- end
256
- end
252
+ documents.map do |doc|
253
+ pluck_from_doc(doc, *fields)
257
254
  end
258
255
  end
259
256
  end
260
257
 
258
+ # Pick the field values in memory.
259
+ #
260
+ # @example Get the values in memory.
261
+ # context.pick(:name)
262
+ #
263
+ # @param [ String | Symbol ] *fields Field(s) to pick.
264
+ #
265
+ # @return [ Object, Array<Object> ] The picked values.
266
+ def pick(*fields)
267
+ if doc = documents.first
268
+ pluck_from_doc(doc, *fields)
269
+ end
270
+ end
271
+
261
272
  # Tally the field values in memory.
262
273
  #
263
274
  # @example Get the counts of values in memory.
@@ -281,7 +292,7 @@ module Mongoid
281
292
  #
282
293
  # @param [ Integer ] value The number of documents to skip.
283
294
  #
284
- # @return [ Mongo ] The context.
295
+ # @return [ Memory ] The context.
285
296
  def skip(value)
286
297
  self.skipping = value
287
298
  self
@@ -295,7 +306,7 @@ module Mongoid
295
306
  # @param [ Hash ] values The sorting values as field/direction(1/-1)
296
307
  # pairs.
297
308
  #
298
- # @return [ Mongo ] The context.
309
+ # @return [ Memory ] The context.
299
310
  def sort(values)
300
311
  in_place_sort(values) and self
301
312
  end
@@ -546,6 +557,22 @@ module Mongoid
546
557
  retrieve_value_at_path(curr, remaining)
547
558
  end
548
559
  end
560
+
561
+ # Pluck the field values from the given document.
562
+ #
563
+ # @param [ Document ] doc The document to pluck from.
564
+ # @param [ String | Symbol ] *fields Field(s) to pluck.
565
+ #
566
+ # @return [ Object, Array<Object> ] The plucked values.
567
+ def pluck_from_doc(doc, *fields)
568
+ if fields.length == 1
569
+ retrieve_value_at_path(doc, fields.first)
570
+ else
571
+ fields.map do |field|
572
+ retrieve_value_at_path(doc, field)
573
+ end
574
+ end
575
+ end
549
576
  end
550
577
  end
551
578
  end