mongoid 7.6.1 → 8.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (314) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +2 -0
  3. data/README.md +3 -3
  4. data/Rakefile +21 -85
  5. data/lib/config/locales/en.yml +46 -30
  6. data/lib/mongoid/association/accessors.rb +32 -3
  7. data/lib/mongoid/association/bindable.rb +48 -0
  8. data/lib/mongoid/association/builders.rb +4 -2
  9. data/lib/mongoid/association/eager_loadable.rb +29 -7
  10. data/lib/mongoid/association/embedded/batchable.rb +28 -5
  11. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  12. data/lib/mongoid/association/embedded/embedded_in.rb +2 -1
  13. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  14. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
  15. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +40 -18
  16. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
  17. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +21 -2
  18. data/lib/mongoid/association/macros.rb +2 -1
  19. data/lib/mongoid/association/many.rb +5 -0
  20. data/lib/mongoid/association/nested/many.rb +2 -1
  21. data/lib/mongoid/association/proxy.rb +12 -0
  22. data/lib/mongoid/association/referenced/auto_save.rb +3 -2
  23. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  24. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  25. data/lib/mongoid/association/referenced/belongs_to.rb +1 -1
  26. data/lib/mongoid/association/referenced/counter_cache.rb +8 -8
  27. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +64 -11
  28. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +4 -1
  29. data/lib/mongoid/association/referenced/has_many/enumerable.rb +10 -18
  30. data/lib/mongoid/association/referenced/has_many/proxy.rb +12 -9
  31. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  32. data/lib/mongoid/association/referenced/has_one/proxy.rb +8 -11
  33. data/lib/mongoid/association/referenced/syncable.rb +2 -2
  34. data/lib/mongoid/association/relatable.rb +38 -4
  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/factory.rb +0 -4
  40. data/lib/mongoid/clients/options.rb +4 -0
  41. data/lib/mongoid/clients/sessions.rb +2 -14
  42. data/lib/mongoid/config.rb +15 -11
  43. data/lib/mongoid/contextual/aggregable/memory.rb +23 -15
  44. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  45. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  46. data/lib/mongoid/contextual/memory.rb +55 -28
  47. data/lib/mongoid/contextual/mongo.rb +173 -287
  48. data/lib/mongoid/contextual/none.rb +33 -15
  49. data/lib/mongoid/copyable.rb +32 -8
  50. data/lib/mongoid/criteria/includable.rb +24 -20
  51. data/lib/mongoid/criteria/marshalable.rb +10 -2
  52. data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -15
  53. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  54. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -1
  55. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  56. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  57. data/lib/mongoid/criteria/queryable/extensions/hash.rb +0 -16
  58. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
  59. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  60. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  61. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +1 -1
  62. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -1
  63. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  64. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  65. data/lib/mongoid/criteria/queryable/optional.rb +3 -9
  66. data/lib/mongoid/criteria/queryable/options.rb +1 -1
  67. data/lib/mongoid/criteria/queryable/selectable.rb +2 -24
  68. data/lib/mongoid/criteria/queryable/selector.rb +90 -5
  69. data/lib/mongoid/criteria/queryable/smash.rb +39 -6
  70. data/lib/mongoid/criteria/queryable/storable.rb +1 -1
  71. data/lib/mongoid/criteria/queryable.rb +11 -6
  72. data/lib/mongoid/criteria.rb +1 -28
  73. data/lib/mongoid/deprecable.rb +36 -0
  74. data/lib/mongoid/deprecation.rb +25 -0
  75. data/lib/mongoid/document.rb +88 -33
  76. data/lib/mongoid/equality.rb +4 -4
  77. data/lib/mongoid/errors/document_not_found.rb +6 -2
  78. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  79. data/lib/mongoid/errors/invalid_field.rb +5 -1
  80. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  81. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  82. data/lib/mongoid/errors.rb +2 -2
  83. data/lib/mongoid/extensions/array.rb +8 -6
  84. data/lib/mongoid/extensions/big_decimal.rb +29 -10
  85. data/lib/mongoid/extensions/binary.rb +42 -0
  86. data/lib/mongoid/extensions/boolean.rb +8 -2
  87. data/lib/mongoid/extensions/date.rb +26 -20
  88. data/lib/mongoid/extensions/date_time.rb +1 -1
  89. data/lib/mongoid/extensions/float.rb +4 -5
  90. data/lib/mongoid/extensions/hash.rb +13 -32
  91. data/lib/mongoid/extensions/integer.rb +4 -5
  92. data/lib/mongoid/extensions/object.rb +2 -0
  93. data/lib/mongoid/extensions/range.rb +41 -10
  94. data/lib/mongoid/extensions/regexp.rb +11 -4
  95. data/lib/mongoid/extensions/set.rb +11 -4
  96. data/lib/mongoid/extensions/string.rb +2 -13
  97. data/lib/mongoid/extensions/symbol.rb +3 -14
  98. data/lib/mongoid/extensions/time.rb +27 -16
  99. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  100. data/lib/mongoid/extensions.rb +1 -0
  101. data/lib/mongoid/factory.rb +42 -7
  102. data/lib/mongoid/fields/foreign_key.rb +7 -0
  103. data/lib/mongoid/fields/validators/macro.rb +3 -9
  104. data/lib/mongoid/fields.rb +49 -7
  105. data/lib/mongoid/findable.rb +21 -16
  106. data/lib/mongoid/indexable/specification.rb +1 -1
  107. data/lib/mongoid/indexable/validators/options.rb +4 -1
  108. data/lib/mongoid/interceptable.rb +69 -9
  109. data/lib/mongoid/persistable/creatable.rb +14 -5
  110. data/lib/mongoid/persistable/updatable.rb +12 -5
  111. data/lib/mongoid/persistence_context.rb +8 -42
  112. data/lib/mongoid/query_cache.rb +6 -258
  113. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  114. data/lib/mongoid/reloadable.rb +7 -3
  115. data/lib/mongoid/scopable.rb +9 -11
  116. data/lib/mongoid/selectable.rb +1 -2
  117. data/lib/mongoid/shardable.rb +11 -35
  118. data/lib/mongoid/stateful.rb +27 -1
  119. data/lib/mongoid/timestamps/created.rb +1 -1
  120. data/lib/mongoid/timestamps/updated.rb +1 -1
  121. data/lib/mongoid/touchable.rb +2 -3
  122. data/lib/mongoid/traversable.rb +1 -0
  123. data/lib/mongoid/validatable/uniqueness.rb +2 -1
  124. data/lib/mongoid/version.rb +1 -5
  125. data/lib/mongoid/warnings.rb +3 -4
  126. data/lib/mongoid.rb +1 -0
  127. data/spec/config/mongoid.yml +16 -0
  128. data/spec/integration/app_spec.rb +8 -12
  129. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  130. data/spec/integration/associations/embedded_spec.rb +15 -0
  131. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  132. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  133. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  134. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  135. data/spec/integration/associations/has_one_spec.rb +97 -1
  136. data/spec/integration/associations/scope_option_spec.rb +1 -1
  137. data/spec/integration/callbacks_models.rb +95 -1
  138. data/spec/integration/callbacks_spec.rb +226 -4
  139. data/spec/integration/criteria/range_spec.rb +95 -1
  140. data/spec/integration/discriminator_key_spec.rb +115 -76
  141. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  142. data/spec/integration/i18n_fallbacks_spec.rb +1 -15
  143. data/spec/integration/matcher_examples_spec.rb +20 -13
  144. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  145. data/spec/integration/matcher_operator_spec.rb +3 -5
  146. data/spec/integration/persistence/range_field_spec.rb +350 -0
  147. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  148. data/spec/mongoid/association/depending_spec.rb +9 -9
  149. data/spec/mongoid/association/eager_spec.rb +2 -1
  150. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  151. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  152. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
  153. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  154. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +198 -8
  155. data/spec/mongoid/association/embedded/embeds_many_models.rb +36 -0
  156. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  157. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  158. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  159. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  160. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  161. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  162. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  163. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  164. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  165. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
  166. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +38 -5
  167. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  168. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  169. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  170. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  171. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +62 -13
  172. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  173. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  174. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  175. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  176. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  177. data/spec/mongoid/association/syncable_spec.rb +14 -0
  178. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  179. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  180. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  181. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  182. data/spec/mongoid/attributes_spec.rb +480 -27
  183. data/spec/mongoid/cacheable_spec.rb +3 -3
  184. data/spec/mongoid/changeable_spec.rb +130 -13
  185. data/spec/mongoid/clients/factory_spec.rb +22 -60
  186. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  187. data/spec/mongoid/clients_spec.rb +2 -2
  188. data/spec/mongoid/config_spec.rb +52 -15
  189. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  190. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  191. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  192. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  193. data/spec/mongoid/contextual/memory_spec.rb +521 -14
  194. data/spec/mongoid/contextual/mongo_spec.rb +566 -426
  195. data/spec/mongoid/contextual/none_spec.rb +11 -19
  196. data/spec/mongoid/copyable_spec.rb +451 -2
  197. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  198. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  199. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  200. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  201. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  202. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  203. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +1 -2
  204. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  205. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  206. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +1 -2
  207. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  208. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  209. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  210. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  211. data/spec/mongoid/criteria/queryable/optional_spec.rb +0 -484
  212. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -0
  213. data/spec/mongoid/criteria/queryable/selectable_spec.rb +77 -85
  214. data/spec/mongoid/criteria/queryable/selector_spec.rb +16 -77
  215. data/spec/mongoid/criteria/queryable/storable_spec.rb +0 -72
  216. data/spec/mongoid/criteria_spec.rb +469 -1201
  217. data/spec/mongoid/document_fields_spec.rb +173 -24
  218. data/spec/mongoid/document_spec.rb +32 -41
  219. data/spec/mongoid/equality_spec.rb +12 -12
  220. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  221. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  222. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  223. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  224. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  225. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  226. data/spec/mongoid/extensions/array_spec.rb +16 -2
  227. data/spec/mongoid/extensions/big_decimal_spec.rb +697 -212
  228. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  229. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  230. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  231. data/spec/mongoid/extensions/date_spec.rb +71 -1
  232. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  233. data/spec/mongoid/extensions/float_spec.rb +48 -76
  234. data/spec/mongoid/extensions/hash_spec.rb +30 -236
  235. data/spec/mongoid/extensions/integer_spec.rb +45 -66
  236. data/spec/mongoid/extensions/range_spec.rb +255 -54
  237. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  238. data/spec/mongoid/extensions/set_spec.rb +106 -0
  239. data/spec/mongoid/extensions/string_spec.rb +53 -25
  240. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  241. data/spec/mongoid/extensions/time_spec.rb +634 -66
  242. data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
  243. data/spec/mongoid/factory_spec.rb +61 -1
  244. data/spec/mongoid/fields_spec.rb +321 -50
  245. data/spec/mongoid/findable_spec.rb +64 -29
  246. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  247. data/spec/mongoid/indexable_spec.rb +16 -19
  248. data/spec/mongoid/interceptable_spec.rb +584 -5
  249. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  250. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  251. data/spec/mongoid/mongoizable_spec.rb +285 -0
  252. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  253. data/spec/mongoid/persistable/deletable_spec.rb +2 -2
  254. data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
  255. data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
  256. data/spec/mongoid/persistence_context_spec.rb +24 -0
  257. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  258. data/spec/mongoid/query_cache_spec.rb +1 -156
  259. data/spec/mongoid/reloadable_spec.rb +35 -2
  260. data/spec/mongoid/scopable_spec.rb +36 -34
  261. data/spec/mongoid/serializable_spec.rb +14 -7
  262. data/spec/mongoid/shardable_models.rb +0 -14
  263. data/spec/mongoid/shardable_spec.rb +61 -153
  264. data/spec/mongoid/stateful_spec.rb +28 -0
  265. data/spec/mongoid/timestamps_spec.rb +390 -0
  266. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  267. data/spec/mongoid/touchable_spec.rb +116 -0
  268. data/spec/mongoid/touchable_spec_models.rb +12 -8
  269. data/spec/mongoid/traversable_spec.rb +4 -11
  270. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  271. data/spec/mongoid/validatable/uniqueness_spec.rb +60 -31
  272. data/spec/mongoid/warnings_spec.rb +35 -0
  273. data/spec/mongoid_spec.rb +1 -7
  274. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  275. data/spec/rails/mongoid_spec.rb +4 -16
  276. data/spec/shared/lib/mrss/docker_runner.rb +1 -8
  277. data/spec/shared/lib/mrss/event_subscriber.rb +5 -15
  278. data/spec/shared/lib/mrss/lite_constraints.rb +2 -10
  279. data/spec/shared/lib/mrss/server_version_registry.rb +24 -17
  280. data/spec/shared/lib/mrss/spec_organizer.rb +3 -32
  281. data/spec/shared/lib/mrss/utils.rb +6 -28
  282. data/spec/shared/share/Dockerfile.erb +107 -33
  283. data/spec/shared/shlib/distro.sh +0 -10
  284. data/spec/shared/shlib/server.sh +33 -64
  285. data/spec/shared/shlib/set_env.sh +71 -12
  286. data/spec/support/constraints.rb +24 -0
  287. data/spec/support/expectations.rb +17 -20
  288. data/spec/support/macros.rb +30 -0
  289. data/spec/support/models/augmentation.rb +12 -0
  290. data/spec/support/models/band.rb +3 -0
  291. data/spec/support/models/catalog.rb +24 -0
  292. data/spec/support/models/circus.rb +3 -0
  293. data/spec/support/models/fanatic.rb +8 -0
  294. data/spec/support/models/implant.rb +9 -0
  295. data/spec/support/models/label.rb +2 -0
  296. data/spec/support/models/passport.rb +9 -0
  297. data/spec/support/models/person.rb +1 -0
  298. data/spec/support/models/player.rb +2 -0
  299. data/spec/support/models/powerup.rb +12 -0
  300. data/spec/support/models/registry.rb +1 -0
  301. data/spec/support/models/school.rb +14 -0
  302. data/spec/support/models/shield.rb +18 -0
  303. data/spec/support/models/student.rb +14 -0
  304. data/spec/support/models/weapon.rb +12 -0
  305. data.tar.gz.sig +0 -0
  306. metadata +695 -641
  307. metadata.gz.sig +0 -0
  308. data/lib/mongoid/errors/eager_load.rb +0 -23
  309. data/lib/mongoid/errors/invalid_value.rb +0 -17
  310. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
  311. data/spec/shared/CANDIDATE.md +0 -28
  312. data/spec/shared/lib/mrss/release/candidate.rb +0 -281
  313. data/spec/shared/lib/mrss/release/product_data.rb +0 -144
  314. data/spec/shared/lib/tasks/candidate.rake +0 -64
@@ -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