mongo 1.12.5 → 2.0.0

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 (475) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CONTRIBUTING.md +64 -0
  4. data/LICENSE +1 -1
  5. data/README.md +21 -126
  6. data/Rakefile +39 -21
  7. data/bin/mongo_console +6 -38
  8. data/lib/mongo/address/ipv4.rb +85 -0
  9. data/lib/mongo/address/ipv6.rb +85 -0
  10. data/lib/mongo/address/unix.rb +76 -0
  11. data/lib/mongo/address.rb +111 -0
  12. data/lib/mongo/auth/cr/conversation.rb +119 -0
  13. data/lib/mongo/auth/cr.rb +44 -0
  14. data/lib/mongo/auth/executable.rb +52 -0
  15. data/lib/mongo/auth/ldap/conversation.rb +92 -0
  16. data/lib/mongo/auth/ldap.rb +48 -0
  17. data/lib/mongo/auth/roles.rb +104 -0
  18. data/lib/mongo/auth/scram/conversation.rb +450 -0
  19. data/lib/mongo/auth/scram.rb +53 -0
  20. data/lib/mongo/auth/user/view.rb +102 -0
  21. data/lib/mongo/auth/user.rb +159 -0
  22. data/lib/mongo/auth/x509/conversation.rb +92 -0
  23. data/lib/mongo/auth/x509.rb +48 -0
  24. data/lib/mongo/auth.rb +108 -0
  25. data/lib/mongo/bulk_write/bulk_writable.rb +191 -0
  26. data/lib/mongo/bulk_write/deletable.rb +60 -0
  27. data/lib/mongo/bulk_write/insertable.rb +52 -0
  28. data/lib/mongo/bulk_write/ordered_bulk_write.rb +48 -0
  29. data/lib/mongo/bulk_write/replacable.rb +57 -0
  30. data/lib/mongo/bulk_write/unordered_bulk_write.rb +46 -0
  31. data/lib/mongo/bulk_write/updatable.rb +68 -0
  32. data/lib/mongo/bulk_write.rb +52 -0
  33. data/lib/mongo/client.rb +246 -0
  34. data/lib/mongo/cluster/topology/replica_set.rb +160 -0
  35. data/lib/mongo/cluster/topology/sharded.rb +132 -0
  36. data/lib/mongo/cluster/topology/standalone.rb +132 -0
  37. data/lib/mongo/cluster/topology/unknown.rb +155 -0
  38. data/lib/mongo/cluster/topology.rb +60 -0
  39. data/lib/mongo/cluster.rb +203 -0
  40. data/lib/mongo/collection/view/aggregation.rb +108 -0
  41. data/lib/mongo/collection/view/explainable.rb +49 -0
  42. data/lib/mongo/collection/view/immutable.rb +43 -0
  43. data/lib/mongo/collection/view/iterable.rb +48 -0
  44. data/lib/mongo/collection/view/map_reduce.rb +191 -0
  45. data/lib/mongo/collection/view/readable.rb +363 -0
  46. data/lib/mongo/collection/view/writable.rb +185 -0
  47. data/lib/mongo/collection/view.rb +169 -0
  48. data/lib/mongo/collection.rb +130 -1101
  49. data/lib/mongo/cursor.rb +78 -681
  50. data/lib/mongo/database/view.rb +101 -0
  51. data/lib/mongo/database.rb +224 -0
  52. data/lib/mongo/error/bulk_write_error.rb +41 -0
  53. data/lib/mongo/error/invalid_bulk_operation.rb +36 -0
  54. data/lib/mongo/error/invalid_bulk_operation_type.rb +36 -0
  55. data/lib/mongo/error/invalid_collection_name.rb +39 -0
  56. data/lib/mongo/error/invalid_database_name.rb +39 -0
  57. data/{test/replica_set/ssl_test.rb → lib/mongo/error/invalid_document.rb} +21 -14
  58. data/lib/mongo/error/invalid_file.rb +38 -0
  59. data/lib/mongo/error/invalid_nonce.rb +46 -0
  60. data/lib/mongo/error/invalid_replacement_document.rb +39 -0
  61. data/lib/mongo/error/invalid_signature.rb +47 -0
  62. data/{test/functional/ssl_test.rb → lib/mongo/error/invalid_update_document.rb} +22 -12
  63. data/lib/mongo/error/max_bson_size.rb +40 -0
  64. data/lib/mongo/error/max_message_size.rb +42 -0
  65. data/{test/functional/db_connection_test.rb → lib/mongo/error/multi_index_drop.rb} +17 -8
  66. data/lib/mongo/{utils.rb → error/need_primary_server.rb} +10 -6
  67. data/lib/mongo/{connection.rb → error/operation_failure.rb} +10 -6
  68. data/lib/mongo/error/parser.rb +77 -0
  69. data/lib/mongo/{connection/socket.rb → error/socket_error.rb} +10 -5
  70. data/lib/mongo/error/socket_timeout_error.rb +23 -0
  71. data/lib/mongo/error/unsupported_features.rb +43 -0
  72. data/lib/mongo/error.rb +82 -0
  73. data/lib/mongo/event/listeners.rb +63 -0
  74. data/lib/mongo/event/primary_elected.rb +53 -0
  75. data/lib/mongo/event/publisher.rb +42 -0
  76. data/lib/mongo/event/server_added.rb +53 -0
  77. data/lib/mongo/event/server_removed.rb +53 -0
  78. data/lib/mongo/event/subscriber.rb +41 -0
  79. data/lib/mongo/event.rb +40 -0
  80. data/lib/mongo/grid/file/chunk.rb +184 -0
  81. data/lib/mongo/grid/file/metadata.rb +229 -0
  82. data/lib/mongo/grid/file.rb +106 -0
  83. data/lib/mongo/grid/fs.rb +149 -0
  84. data/lib/mongo/{gridfs.rb → grid.rb} +3 -5
  85. data/lib/mongo/index/view.rb +261 -0
  86. data/lib/mongo/index.rb +64 -0
  87. data/lib/mongo/loggable.rb +126 -0
  88. data/lib/mongo/logger.rb +132 -0
  89. data/lib/mongo/operation/aggregate/result.rb +88 -0
  90. data/lib/mongo/operation/aggregate.rb +100 -0
  91. data/lib/mongo/operation/command.rb +62 -0
  92. data/lib/mongo/operation/executable.rb +105 -0
  93. data/lib/mongo/operation/kill_cursors.rb +39 -0
  94. data/lib/mongo/operation/limited.rb +37 -0
  95. data/lib/mongo/operation/list_collections/result.rb +114 -0
  96. data/lib/mongo/operation/list_indexes/result.rb +118 -0
  97. data/lib/mongo/operation/map_reduce/result.rb +122 -0
  98. data/lib/mongo/operation/map_reduce.rb +96 -0
  99. data/lib/mongo/operation/read/collections_info.rb +67 -0
  100. data/lib/mongo/operation/read/get_more.rb +71 -0
  101. data/lib/mongo/operation/read/indexes.rb +68 -0
  102. data/lib/mongo/operation/read/list_collections.rb +75 -0
  103. data/lib/mongo/operation/read/list_indexes.rb +77 -0
  104. data/lib/mongo/operation/read/query.rb +71 -0
  105. data/lib/mongo/{functional.rb → operation/read.rb} +7 -7
  106. data/lib/mongo/operation/read_preferrable.rb +34 -0
  107. data/lib/mongo/operation/result.rb +259 -0
  108. data/lib/mongo/operation/specifiable.rb +397 -0
  109. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +75 -0
  110. data/lib/mongo/operation/write/bulk/bulk_delete.rb +144 -0
  111. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +68 -0
  112. data/lib/mongo/operation/write/bulk/bulk_insert.rb +129 -0
  113. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +67 -0
  114. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +162 -0
  115. data/lib/mongo/operation/write/bulk/bulk_update.rb +153 -0
  116. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +83 -0
  117. data/lib/mongo/operation/write/bulk.rb +17 -0
  118. data/lib/mongo/operation/write/command/create_index.rb +50 -0
  119. data/lib/mongo/operation/write/command/create_user.rb +43 -0
  120. data/lib/mongo/operation/write/command/delete.rb +56 -0
  121. data/lib/mongo/operation/write/command/drop_index.rb +51 -0
  122. data/lib/mongo/operation/write/command/insert.rb +55 -0
  123. data/lib/mongo/operation/write/command/remove_user.rb +42 -0
  124. data/lib/mongo/operation/write/command/update.rb +60 -0
  125. data/lib/mongo/operation/write/command/writable.rb +61 -0
  126. data/lib/mongo/operation/write/command.rb +22 -0
  127. data/lib/mongo/operation/write/create_index.rb +89 -0
  128. data/lib/mongo/operation/write/create_user.rb +75 -0
  129. data/lib/mongo/operation/write/delete/result.rb +40 -0
  130. data/lib/mongo/operation/write/delete.rb +93 -0
  131. data/lib/mongo/operation/write/drop_index.rb +62 -0
  132. data/lib/mongo/{utils/thread_local_variable_manager.rb → operation/write/insert/result.rb} +15 -8
  133. data/lib/mongo/operation/write/insert.rb +90 -0
  134. data/lib/mongo/operation/write/remove_user.rb +70 -0
  135. data/lib/mongo/operation/write/update/result.rb +160 -0
  136. data/lib/mongo/operation/write/update.rb +103 -0
  137. data/lib/mongo/{connection/socket/socket_util.rb → operation/write.rb} +10 -24
  138. data/lib/mongo/operation.rb +25 -0
  139. data/lib/mongo/options/mapper.rb +78 -0
  140. data/lib/mongo/options.rb +15 -0
  141. data/lib/mongo/protocol/bit_vector.rb +61 -0
  142. data/lib/mongo/protocol/delete.rb +94 -0
  143. data/lib/mongo/protocol/get_more.rb +99 -0
  144. data/lib/mongo/protocol/insert.rb +99 -0
  145. data/lib/mongo/protocol/kill_cursors.rb +74 -0
  146. data/lib/mongo/protocol/message.rb +252 -0
  147. data/lib/mongo/protocol/query.rb +147 -0
  148. data/lib/mongo/protocol/reply.rb +72 -0
  149. data/lib/mongo/protocol/serializers.rb +180 -0
  150. data/lib/mongo/protocol/update.rb +111 -0
  151. data/lib/mongo/protocol.rb +15 -0
  152. data/lib/mongo/server/connectable.rb +110 -0
  153. data/lib/mongo/server/connection.rb +134 -0
  154. data/lib/mongo/server/connection_pool/queue.rb +182 -0
  155. data/lib/mongo/server/connection_pool.rb +141 -0
  156. data/lib/mongo/server/context.rb +66 -0
  157. data/lib/mongo/server/description/features.rb +85 -0
  158. data/lib/mongo/server/description/inspector/primary_elected.rb +58 -0
  159. data/lib/mongo/server/description/inspector/server_added.rb +59 -0
  160. data/lib/mongo/server/description/inspector/server_removed.rb +59 -0
  161. data/lib/mongo/server/description/inspector.rb +79 -0
  162. data/lib/mongo/server/description.rb +450 -0
  163. data/lib/mongo/server/monitor/connection.rb +89 -0
  164. data/lib/mongo/server/monitor.rb +176 -0
  165. data/lib/mongo/server.rb +163 -0
  166. data/lib/mongo/server_selector/nearest.rb +94 -0
  167. data/lib/mongo/server_selector/primary.rb +88 -0
  168. data/lib/mongo/server_selector/primary_preferred.rb +94 -0
  169. data/lib/mongo/server_selector/secondary.rb +91 -0
  170. data/lib/mongo/server_selector/secondary_preferred.rb +96 -0
  171. data/lib/mongo/server_selector/selectable.rb +209 -0
  172. data/lib/mongo/server_selector.rb +81 -0
  173. data/lib/mongo/socket/ssl.rb +130 -0
  174. data/lib/mongo/socket/tcp.rb +69 -0
  175. data/lib/mongo/socket/unix.rb +64 -0
  176. data/lib/mongo/socket.rb +179 -0
  177. data/lib/mongo/uri.rb +504 -0
  178. data/lib/mongo/version.rb +21 -0
  179. data/lib/mongo/write_concern/acknowledged.rb +52 -0
  180. data/lib/mongo/write_concern/normalizable.rb +51 -0
  181. data/lib/mongo/write_concern/unacknowledged.rb +55 -0
  182. data/lib/mongo/write_concern.rb +99 -0
  183. data/lib/mongo.rb +24 -82
  184. data/mongo.gemspec +17 -14
  185. data/spec/certificates/ca.pem +17 -0
  186. data/spec/certificates/client.pem +101 -0
  187. data/spec/certificates/crl.pem +10 -0
  188. data/spec/certificates/crl_client_revoked.pem +12 -0
  189. data/spec/certificates/password_protected.pem +51 -0
  190. data/spec/certificates/server.pem +34 -0
  191. data/spec/mongo/address/ipv4_spec.rb +74 -0
  192. data/spec/mongo/address/ipv6_spec.rb +74 -0
  193. data/spec/mongo/address/unix_spec.rb +30 -0
  194. data/spec/mongo/address_spec.rb +206 -0
  195. data/spec/mongo/auth/cr_spec.rb +59 -0
  196. data/spec/mongo/auth/ldap_spec.rb +40 -0
  197. data/spec/mongo/auth/scram/conversation_spec.rb +197 -0
  198. data/spec/mongo/auth/scram_spec.rb +55 -0
  199. data/spec/mongo/auth/user/view_spec.rb +76 -0
  200. data/spec/mongo/auth/user_spec.rb +190 -0
  201. data/spec/mongo/auth/x509_spec.rb +40 -0
  202. data/spec/mongo/auth_spec.rb +65 -0
  203. data/spec/mongo/bulk/bulk_write_spec.rb +262 -0
  204. data/spec/mongo/client_spec.rb +564 -0
  205. data/spec/mongo/cluster/topology/replica_set_spec.rb +101 -0
  206. data/spec/mongo/cluster/topology/sharded_spec.rb +74 -0
  207. data/spec/mongo/cluster/topology/standalone_spec.rb +79 -0
  208. data/spec/mongo/cluster/topology_spec.rb +65 -0
  209. data/spec/mongo/cluster_spec.rb +129 -0
  210. data/spec/mongo/collection/view/aggregation_spec.rb +148 -0
  211. data/spec/mongo/collection/view/explainable_spec.rb +32 -0
  212. data/spec/mongo/collection/view/map_reduce_spec.rb +242 -0
  213. data/spec/mongo/collection/view/readable_spec.rb +603 -0
  214. data/spec/mongo/collection/view/writable_spec.rb +679 -0
  215. data/spec/mongo/collection/view_spec.rb +530 -0
  216. data/spec/mongo/collection_spec.rb +362 -0
  217. data/spec/mongo/crud_spec.rb +42 -0
  218. data/spec/mongo/cursor_spec.rb +295 -0
  219. data/spec/mongo/database_spec.rb +302 -0
  220. data/spec/mongo/error/parser_spec.rb +119 -0
  221. data/spec/mongo/event/publisher_spec.rb +50 -0
  222. data/spec/mongo/event/subscriber_spec.rb +34 -0
  223. data/spec/mongo/grid/file/chunk_spec.rb +226 -0
  224. data/spec/mongo/grid/file/metadata_spec.rb +92 -0
  225. data/spec/mongo/grid/file_spec.rb +172 -0
  226. data/spec/mongo/grid/fs_spec.rb +129 -0
  227. data/spec/mongo/index/view_spec.rb +330 -0
  228. data/spec/mongo/loggable_spec.rb +62 -0
  229. data/spec/mongo/logger_spec.rb +97 -0
  230. data/spec/mongo/operation/aggregate/result_spec.rb +80 -0
  231. data/spec/mongo/operation/aggregate_spec.rb +127 -0
  232. data/spec/mongo/operation/command_spec.rb +98 -0
  233. data/spec/mongo/operation/kill_cursors_spec.rb +66 -0
  234. data/spec/mongo/operation/limited_spec.rb +50 -0
  235. data/spec/mongo/operation/map_reduce_spec.rb +143 -0
  236. data/spec/mongo/operation/read/collections_info_spec.rb +40 -0
  237. data/spec/mongo/operation/read/get_more_spec.rb +81 -0
  238. data/spec/mongo/operation/read/indexes_spec.rb +31 -0
  239. data/spec/mongo/operation/read/query_spec.rb +84 -0
  240. data/spec/mongo/operation/result_spec.rb +275 -0
  241. data/spec/mongo/operation/specifiable_spec.rb +53 -0
  242. data/spec/mongo/operation/write/bulk_delete_spec.rb +235 -0
  243. data/spec/mongo/operation/write/bulk_insert_spec.rb +235 -0
  244. data/spec/mongo/operation/write/bulk_update_spec.rb +236 -0
  245. data/spec/mongo/operation/write/command/delete_spec.rb +103 -0
  246. data/spec/mongo/operation/write/command/insert_spec.rb +103 -0
  247. data/spec/mongo/operation/write/command/update_spec.rb +109 -0
  248. data/spec/mongo/operation/write/create_index_spec.rb +63 -0
  249. data/spec/mongo/operation/write/create_user_spec.rb +44 -0
  250. data/spec/mongo/operation/write/delete_spec.rb +186 -0
  251. data/spec/mongo/operation/write/drop_index_spec.rb +51 -0
  252. data/spec/mongo/operation/write/insert_spec.rb +244 -0
  253. data/spec/mongo/operation/write/remove_user_spec.rb +46 -0
  254. data/spec/mongo/operation/write/response_spec.rb +85 -0
  255. data/spec/mongo/operation/write/update_spec.rb +228 -0
  256. data/spec/mongo/protocol/delete_spec.rb +167 -0
  257. data/spec/mongo/protocol/get_more_spec.rb +146 -0
  258. data/spec/mongo/protocol/insert_spec.rb +161 -0
  259. data/spec/mongo/protocol/kill_cursors_spec.rb +101 -0
  260. data/spec/mongo/protocol/query_spec.rb +285 -0
  261. data/spec/mongo/protocol/reply_spec.rb +157 -0
  262. data/spec/mongo/protocol/update_spec.rb +186 -0
  263. data/spec/mongo/server/connection_pool/queue_spec.rb +170 -0
  264. data/spec/mongo/server/connection_pool_spec.rb +120 -0
  265. data/spec/mongo/server/connection_spec.rb +312 -0
  266. data/spec/mongo/server/description/features_spec.rb +138 -0
  267. data/spec/mongo/server/description/inspector/primary_elected_spec.rb +94 -0
  268. data/spec/mongo/server/description/inspector/server_added_spec.rb +92 -0
  269. data/spec/mongo/server/description/inspector/server_removed_spec.rb +95 -0
  270. data/spec/mongo/server/description_spec.rb +510 -0
  271. data/spec/mongo/server/monitor_spec.rb +144 -0
  272. data/spec/mongo/server_discovery_and_monitoring_spec.rb +103 -0
  273. data/spec/mongo/server_selection_rtt_spec.rb +104 -0
  274. data/spec/mongo/server_selection_spec.rb +89 -0
  275. data/spec/mongo/server_selector/nearest_spec.rb +250 -0
  276. data/spec/mongo/server_selector/primary_preferred_spec.rb +290 -0
  277. data/spec/mongo/server_selector/primary_spec.rb +114 -0
  278. data/spec/mongo/server_selector/secondary_preferred_spec.rb +252 -0
  279. data/spec/mongo/server_selector/secondary_spec.rb +196 -0
  280. data/spec/mongo/server_selector_spec.rb +101 -0
  281. data/spec/mongo/server_spec.rb +131 -0
  282. data/spec/mongo/uri_spec.rb +517 -0
  283. data/spec/mongo/write_concern/acknowledged_spec.rb +44 -0
  284. data/spec/mongo/write_concern/unacknowledged_spec.rb +15 -0
  285. data/spec/spec_helper.rb +133 -0
  286. data/spec/support/authorization.rb +247 -0
  287. data/spec/support/crud/read.rb +144 -0
  288. data/spec/support/crud/write.rb +214 -0
  289. data/spec/support/crud.rb +203 -0
  290. data/spec/support/crud_tests/read/aggregate.yml +43 -0
  291. data/spec/support/crud_tests/read/count.yml +37 -0
  292. data/spec/support/crud_tests/read/distinct.yml +33 -0
  293. data/spec/support/crud_tests/read/find.yml +50 -0
  294. data/spec/support/crud_tests/write/deleteMany.yml +36 -0
  295. data/spec/support/crud_tests/write/deleteOne.yml +49 -0
  296. data/spec/support/crud_tests/write/findOneAndDelete.yml +54 -0
  297. data/spec/support/crud_tests/write/findOneAndReplace.yml +153 -0
  298. data/spec/support/crud_tests/write/findOneAndUpdate.yml +161 -0
  299. data/spec/support/crud_tests/write/insertMany.yml +24 -0
  300. data/spec/support/crud_tests/write/insertOne.yml +19 -0
  301. data/spec/support/crud_tests/write/replaceOne.yml +96 -0
  302. data/spec/support/crud_tests/write/updateMany.yml +83 -0
  303. data/spec/support/crud_tests/write/updateOne.yml +80 -0
  304. data/spec/support/helpers.rb +140 -0
  305. data/spec/support/matchers.rb +37 -0
  306. data/spec/support/sdam/rs/discover_arbiters.yml +41 -0
  307. data/spec/support/sdam/rs/discover_passives.yml +41 -0
  308. data/spec/support/sdam/rs/discover_primary.yml +40 -0
  309. data/spec/support/sdam/rs/discover_secondary.yml +41 -0
  310. data/spec/support/sdam/rs/discovery.yml +195 -0
  311. data/spec/support/sdam/rs/ghost_discovered.yml +39 -0
  312. data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +34 -0
  313. data/spec/support/sdam/rs/member_reconfig.yml +68 -0
  314. data/spec/support/sdam/rs/member_standalone.yml +60 -0
  315. data/spec/support/sdam/rs/new_primary.yml +74 -0
  316. data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +71 -0
  317. data/spec/support/sdam/rs/non_rs_member.yml +31 -0
  318. data/spec/support/sdam/rs/normalize_case.yml +49 -0
  319. data/spec/support/sdam/rs/primary_becomes_standalone.yml +52 -0
  320. data/spec/support/sdam/rs/primary_changes_set_name.yml +57 -0
  321. data/spec/support/sdam/rs/primary_disconnect.yml +56 -0
  322. data/spec/support/sdam/rs/primary_wrong_set_name.yml +27 -0
  323. data/spec/support/sdam/rs/response_from_removed.yml +63 -0
  324. data/spec/support/sdam/rs/rsother_discovered.yml +41 -0
  325. data/spec/support/sdam/rs/sec_not_auth.yml +49 -0
  326. data/spec/support/sdam/rs/secondary_wrong_set_name.yml +28 -0
  327. data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +69 -0
  328. data/spec/support/sdam/rs/unexpected_mongos.yml +26 -0
  329. data/spec/support/sdam/rs/wrong_set_name.yml +35 -0
  330. data/spec/support/sdam/sharded/multiple_mongoses.yml +46 -0
  331. data/spec/support/sdam/sharded/non_mongos_removed.yml +41 -0
  332. data/spec/support/sdam/sharded/normalize_uri_case.yml +32 -0
  333. data/spec/support/sdam/single/direct_connection_external_ip.yml +34 -0
  334. data/spec/support/sdam/single/direct_connection_mongos.yml +33 -0
  335. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +35 -0
  336. data/spec/support/sdam/single/direct_connection_rsprimary.yml +34 -0
  337. data/spec/support/sdam/single/direct_connection_rssecondary.yml +35 -0
  338. data/spec/support/sdam/single/direct_connection_slave.yml +32 -0
  339. data/spec/support/sdam/single/direct_connection_standalone.yml +32 -0
  340. data/spec/support/sdam/single/not_ok_response.yml +39 -0
  341. data/spec/support/sdam/single/standalone_removed.yml +32 -0
  342. data/spec/support/sdam/single/unavailable_seed.yml +28 -0
  343. data/spec/support/server_discovery_and_monitoring.rb +167 -0
  344. data/spec/support/server_selection/rtt/first_value.yml +4 -0
  345. data/spec/support/server_selection/rtt/first_value_zero.yml +4 -0
  346. data/spec/support/server_selection/rtt/value_test_1.yml +4 -0
  347. data/spec/support/server_selection/rtt/value_test_2.yml +4 -0
  348. data/spec/support/server_selection/rtt/value_test_3.yml +4 -0
  349. data/spec/support/server_selection/rtt/value_test_4.yml +4 -0
  350. data/spec/support/server_selection/rtt/value_test_5.yml +4 -0
  351. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest.yml +26 -0
  352. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +21 -0
  353. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Primary.yml +21 -0
  354. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +26 -0
  355. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +21 -0
  356. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary.yml +26 -0
  357. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +26 -0
  358. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +21 -0
  359. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +21 -0
  360. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest.yml +33 -0
  361. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +26 -0
  362. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Primary.yml +29 -0
  363. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +29 -0
  364. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +29 -0
  365. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary.yml +31 -0
  366. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred.yml +31 -0
  367. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.yml +29 -0
  368. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary_non_matching.yml +26 -0
  369. data/spec/support/server_selection/selection/Sharded/read/SecondaryPreferred.yml +26 -0
  370. data/spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml +19 -0
  371. data/spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml +11 -0
  372. data/spec/support/server_selection.rb +157 -0
  373. data/spec/support/server_selection_rtt.rb +41 -0
  374. data/spec/support/shared/bulk_write.rb +535 -0
  375. data/spec/support/shared/cursor.rb +38 -0
  376. data/spec/support/shared/operation.rb +77 -0
  377. data/spec/support/shared/protocol.rb +31 -0
  378. data/spec/support/shared/server_selector.rb +111 -0
  379. data/spec/support/shared/socket.rb +82 -0
  380. data/spec/support/travis.rb +14 -0
  381. data.tar.gz.sig +2 -3
  382. metadata +583 -186
  383. metadata.gz.sig +0 -0
  384. data/VERSION +0 -1
  385. data/lib/mongo/bulk_write_collection_view.rb +0 -387
  386. data/lib/mongo/collection_writer.rb +0 -364
  387. data/lib/mongo/connection/node.rb +0 -249
  388. data/lib/mongo/connection/pool.rb +0 -340
  389. data/lib/mongo/connection/pool_manager.rb +0 -320
  390. data/lib/mongo/connection/sharding_pool_manager.rb +0 -67
  391. data/lib/mongo/connection/socket/ssl_socket.rb +0 -95
  392. data/lib/mongo/connection/socket/tcp_socket.rb +0 -87
  393. data/lib/mongo/connection/socket/unix_socket.rb +0 -39
  394. data/lib/mongo/db.rb +0 -808
  395. data/lib/mongo/exception.rb +0 -145
  396. data/lib/mongo/functional/authentication.rb +0 -455
  397. data/lib/mongo/functional/logging.rb +0 -85
  398. data/lib/mongo/functional/read_preference.rb +0 -183
  399. data/lib/mongo/functional/scram.rb +0 -556
  400. data/lib/mongo/functional/uri_parser.rb +0 -409
  401. data/lib/mongo/functional/write_concern.rb +0 -66
  402. data/lib/mongo/gridfs/grid.rb +0 -112
  403. data/lib/mongo/gridfs/grid_ext.rb +0 -53
  404. data/lib/mongo/gridfs/grid_file_system.rb +0 -163
  405. data/lib/mongo/gridfs/grid_io.rb +0 -484
  406. data/lib/mongo/legacy.rb +0 -140
  407. data/lib/mongo/mongo_client.rb +0 -697
  408. data/lib/mongo/mongo_replica_set_client.rb +0 -535
  409. data/lib/mongo/mongo_sharded_client.rb +0 -159
  410. data/lib/mongo/networking.rb +0 -372
  411. data/lib/mongo/utils/conversions.rb +0 -110
  412. data/lib/mongo/utils/core_ext.rb +0 -70
  413. data/lib/mongo/utils/server_version.rb +0 -69
  414. data/lib/mongo/utils/support.rb +0 -80
  415. data/test/functional/authentication_test.rb +0 -39
  416. data/test/functional/bulk_api_stress_test.rb +0 -133
  417. data/test/functional/bulk_write_collection_view_test.rb +0 -1198
  418. data/test/functional/client_test.rb +0 -627
  419. data/test/functional/collection_test.rb +0 -2175
  420. data/test/functional/collection_writer_test.rb +0 -83
  421. data/test/functional/conversions_test.rb +0 -163
  422. data/test/functional/cursor_fail_test.rb +0 -57
  423. data/test/functional/cursor_message_test.rb +0 -56
  424. data/test/functional/cursor_test.rb +0 -683
  425. data/test/functional/db_api_test.rb +0 -835
  426. data/test/functional/db_test.rb +0 -348
  427. data/test/functional/grid_file_system_test.rb +0 -285
  428. data/test/functional/grid_io_test.rb +0 -252
  429. data/test/functional/grid_test.rb +0 -273
  430. data/test/functional/pool_test.rb +0 -136
  431. data/test/functional/safe_test.rb +0 -98
  432. data/test/functional/support_test.rb +0 -62
  433. data/test/functional/timeout_test.rb +0 -60
  434. data/test/functional/uri_test.rb +0 -446
  435. data/test/functional/write_concern_test.rb +0 -118
  436. data/test/helpers/general.rb +0 -50
  437. data/test/helpers/test_unit.rb +0 -476
  438. data/test/replica_set/authentication_test.rb +0 -37
  439. data/test/replica_set/basic_test.rb +0 -189
  440. data/test/replica_set/client_test.rb +0 -393
  441. data/test/replica_set/connection_test.rb +0 -138
  442. data/test/replica_set/count_test.rb +0 -66
  443. data/test/replica_set/cursor_test.rb +0 -220
  444. data/test/replica_set/insert_test.rb +0 -157
  445. data/test/replica_set/max_values_test.rb +0 -151
  446. data/test/replica_set/pinning_test.rb +0 -105
  447. data/test/replica_set/query_test.rb +0 -73
  448. data/test/replica_set/read_preference_test.rb +0 -219
  449. data/test/replica_set/refresh_test.rb +0 -211
  450. data/test/replica_set/replication_ack_test.rb +0 -95
  451. data/test/sharded_cluster/basic_test.rb +0 -203
  452. data/test/shared/authentication/basic_auth_shared.rb +0 -260
  453. data/test/shared/authentication/bulk_api_auth_shared.rb +0 -249
  454. data/test/shared/authentication/gssapi_shared.rb +0 -176
  455. data/test/shared/authentication/sasl_plain_shared.rb +0 -96
  456. data/test/shared/authentication/scram_shared.rb +0 -92
  457. data/test/shared/ssl_shared.rb +0 -235
  458. data/test/test_helper.rb +0 -61
  459. data/test/threading/basic_test.rb +0 -120
  460. data/test/tools/mongo_config.rb +0 -708
  461. data/test/tools/mongo_config_test.rb +0 -160
  462. data/test/unit/client_test.rb +0 -381
  463. data/test/unit/collection_test.rb +0 -166
  464. data/test/unit/connection_test.rb +0 -335
  465. data/test/unit/cursor_test.rb +0 -307
  466. data/test/unit/db_test.rb +0 -136
  467. data/test/unit/grid_test.rb +0 -76
  468. data/test/unit/mongo_sharded_client_test.rb +0 -48
  469. data/test/unit/node_test.rb +0 -93
  470. data/test/unit/pool_manager_test.rb +0 -111
  471. data/test/unit/read_pref_test.rb +0 -406
  472. data/test/unit/read_test.rb +0 -159
  473. data/test/unit/safe_test.rb +0 -158
  474. data/test/unit/sharding_pool_manager_test.rb +0 -84
  475. data/test/unit/write_concern_test.rb +0 -175
@@ -0,0 +1,203 @@
1
+ # Copyright (C) 2014-2015 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ # Matcher for determining if the results of the opeartion match the
16
+ # test's expected results.
17
+ #
18
+ # @since 2.0.0
19
+
20
+ # Matcher for determining if the collection's data matches the
21
+ # test's expected collection data.
22
+ #
23
+ # @since 2.0.0
24
+ RSpec::Matchers.define :match_collection_data do |test|
25
+
26
+ match do |actual|
27
+ test.compare_collection_data
28
+ end
29
+ end
30
+
31
+ require 'support/crud/read'
32
+ require 'support/crud/write'
33
+
34
+ module Mongo
35
+ module CRUD
36
+
37
+ # Represents a CRUD specification test.
38
+ #
39
+ # @since 2.0.0
40
+ class Spec
41
+
42
+ # @return [ String ] description The spec description.
43
+ #
44
+ # @since 2.0.0
45
+ attr_reader :description
46
+
47
+ # Instantiate the new spec.
48
+ #
49
+ # @example Create the spec.
50
+ # Spec.new(file)
51
+ #
52
+ # @param [ String ] file The name of the file.
53
+ #
54
+ # @since 2.0.0
55
+ def initialize(file)
56
+ @spec = YAML.load(ERB.new(File.new(file).read).result)
57
+ @description = File.basename(file)
58
+ @data = @spec['data']
59
+ @crud_tests = @spec['tests']
60
+ end
61
+
62
+ # Get a list of CRUDTests for each test definition.
63
+ #
64
+ # @example Get the list of CRUDTests.
65
+ # spec.tests
66
+ #
67
+ # @return [ Array<CRUDTest> ] The list of CRUDTests.
68
+ #
69
+ # @since 2.0.0
70
+ def tests
71
+ @crud_tests.collect do |test|
72
+ Mongo::CRUD::CRUDTest.new(@data, test)
73
+ end
74
+ end
75
+ end
76
+
77
+ # Represents a single CRUD test.
78
+ #
79
+ # @since 2.0.0
80
+ class CRUDTest
81
+
82
+ # The test description.
83
+ #
84
+ # @return [ String ] description The test description.
85
+ #
86
+ # @since 2.0.0
87
+ attr_reader :description
88
+
89
+ # Instantiate the new CRUDTest.
90
+ #
91
+ # @example Create the test.
92
+ # CRUDTest.new(data, test)
93
+ #
94
+ # @param [ Array<Hash> ] data The documents the collection
95
+ # must have before the test runs.
96
+ # @param [ Hash ] test The test specification.
97
+ #
98
+ # @since 2.0.0
99
+ def initialize(data, test)
100
+ @data = data
101
+ @description = test['description']
102
+ @operation = Operation.get(test['operation'])
103
+ @outcome = test['outcome']
104
+ end
105
+
106
+ # Run the test.
107
+ #
108
+ # @example Run the test.
109
+ # test.run(collection)
110
+ #
111
+ # @param [ Collection ] collection The collection the test
112
+ # should be run on.
113
+ #
114
+ # @return [ Result, Array<Hash> ] The result(s) of running the test.
115
+ #
116
+ # @since 2.0.0
117
+ def run(collection)
118
+ @collection = collection
119
+ @collection.insert_many(@data)
120
+ @operation.execute(collection)
121
+ end
122
+
123
+ # The expected result of running the test.
124
+ #
125
+ # @example Get the expected result of running the test.
126
+ # test.result
127
+ #
128
+ # @return [ Array<Hash> ] The expected result of running the test.
129
+ #
130
+ # @since 2.0.0
131
+ def result
132
+ @operation.has_results? ? @outcome['result'] : []
133
+ end
134
+
135
+ # Compare the existing collection data and the expected collection data.
136
+ #
137
+ # @example Compare the existing and expected collection data.
138
+ # test.compare_collection_data
139
+ #
140
+ # @return [ true, false ] The result of comparing the existing and expected
141
+ # collection data.
142
+ #
143
+ # @since 2.0.0
144
+ def compare_collection_data
145
+ actual_collection_data == outcome_collection_data
146
+ end
147
+
148
+ # Whether this test requires server version >= 2.6 for its results to match
149
+ # the expected results.
150
+ #
151
+ # @example If this test requires >= 2.6.
152
+ # test.requires_2_6?(collection)
153
+ #
154
+ # @param [ true, false ] If write commands are enabled on the server.
155
+ # @param [ Collection ] The collection the test is run on.
156
+ #
157
+ # @return [ true, false ] Whether the test requires server >= 2.6.
158
+ #
159
+ # @since 2.0.0
160
+ def requires_2_6?(write_command_enabled, collection)
161
+ !write_command_enabled && @operation.requires_2_6?(collection)
162
+ end
163
+
164
+ private
165
+
166
+ def outcome_collection_data
167
+ @outcome['collection']['data'] if @outcome['collection']
168
+ end
169
+
170
+ def actual_collection_data
171
+ if @outcome['collection']
172
+ collection_name = @outcome['collection']['name'] || @collection.name
173
+ @collection.database[collection_name].find.to_a
174
+ end
175
+ end
176
+ end
177
+
178
+ # Helper module for instantiating either a Read or Write test operation.
179
+ #
180
+ # @since 2.0.0
181
+ module Operation
182
+ extend self
183
+
184
+ # Get a new Operation.
185
+ #
186
+ # @example Get the operation.
187
+ # Operation.get(spec)
188
+ #
189
+ # @param [ Hash ] spec The operation specification.
190
+ #
191
+ # @return [ Operation::Write, Operation::Read ] The Operation object.
192
+ #
193
+ # @since 2.0.0
194
+ def get(spec)
195
+ if Write::OPERATIONS.keys.include?(spec['name'])
196
+ Write.new(spec)
197
+ else
198
+ Read.new(spec)
199
+ end
200
+ end
201
+ end
202
+ end
203
+ end
@@ -0,0 +1,43 @@
1
+ data:
2
+ - {_id: 1, x: 11}
3
+ - {_id: 2, x: 22}
4
+ - {_id: 3, x: 33}
5
+
6
+ tests:
7
+ -
8
+ description: "Aggregate with multiple stages"
9
+ operation:
10
+ name: aggregate
11
+ arguments:
12
+ pipeline:
13
+ - $sort: {x: 1}
14
+ - $match:
15
+ _id: {$gt: 1}
16
+ batchSize: 2
17
+
18
+ outcome:
19
+ result:
20
+ - {_id: 2, x: 22}
21
+ - {_id: 3, x: 33}
22
+ -
23
+ description: "Aggregate with $out"
24
+ operation:
25
+ name: aggregate
26
+ arguments:
27
+ pipeline:
28
+ - $sort: {x: 1}
29
+ - $match:
30
+ _id: {$gt: 1}
31
+ - $out: "other_test_collection"
32
+ batchSize: 2
33
+
34
+ outcome:
35
+ result:
36
+ - {_id: 2, x: 22}
37
+ - {_id: 3, x: 33}
38
+ collection:
39
+ name: "other_test_collection"
40
+ data:
41
+ - {_id: 2, x: 22}
42
+ - {_id: 3, x: 33}
43
+
@@ -0,0 +1,37 @@
1
+ data:
2
+ - {_id: 1, x: 11}
3
+ - {_id: 2, x: 22}
4
+ - {_id: 3, x: 33}
5
+
6
+ tests:
7
+ -
8
+ description: "Count without a filter"
9
+ operation:
10
+ name: count
11
+ arguments:
12
+ filter: { }
13
+
14
+ outcome:
15
+ result: 3
16
+ -
17
+ description: "Count with a filter"
18
+ operation:
19
+ name: count
20
+ arguments:
21
+ filter:
22
+ _id: {$gt: 1}
23
+
24
+ outcome:
25
+ result: 2
26
+ -
27
+ description: "Count with skip and limit"
28
+ operation:
29
+ name: count
30
+ arguments:
31
+ filter: {}
32
+ skip: 1
33
+ limit: 3
34
+
35
+ outcome:
36
+ result: 2
37
+
@@ -0,0 +1,33 @@
1
+ data:
2
+ - {_id: 1, x: 11}
3
+ - {_id: 2, x: 22}
4
+ - {_id: 3, x: 33}
5
+
6
+ tests:
7
+ -
8
+ description: "Distinct without a filter"
9
+ operation:
10
+ name: distinct
11
+ arguments:
12
+ fieldName: "x"
13
+ filter: {}
14
+
15
+ outcome:
16
+ result:
17
+ - 11
18
+ - 22
19
+ - 33
20
+ -
21
+ description: "Distinct with a filter"
22
+ operation:
23
+ name: distinct
24
+ arguments:
25
+ fieldName: "x"
26
+ filter:
27
+ _id: {$gt: 1}
28
+
29
+ outcome:
30
+ result:
31
+ - 22
32
+ - 33
33
+
@@ -0,0 +1,50 @@
1
+ data:
2
+ - {_id: 1, x: 11}
3
+ - {_id: 2, x: 22}
4
+ - {_id: 3, x: 33}
5
+ - {_id: 4, x: 44}
6
+ - {_id: 5, x: 55}
7
+
8
+ tests:
9
+ -
10
+ description: "Find with filter"
11
+ operation:
12
+ name: "find"
13
+ arguments:
14
+ filter: {_id: 1}
15
+
16
+ outcome:
17
+ result:
18
+ - {_id: 1, x: 11}
19
+
20
+ -
21
+ description: "Find with filter, sort, skip, and limit"
22
+ operation:
23
+ name: "find"
24
+ arguments:
25
+ filter:
26
+ _id: {$gt: 2}
27
+ sort: {_id: 1}
28
+ skip: 2
29
+ limit: 2
30
+
31
+ outcome:
32
+ result:
33
+ - {_id: 5, x: 55}
34
+ -
35
+ description: "Find with limit, sort, and batchsize"
36
+ operation:
37
+ name: "find"
38
+ arguments:
39
+ filter: {}
40
+ sort: {_id: 1}
41
+ limit: 4
42
+ batchSize: 2
43
+
44
+ outcome:
45
+ result:
46
+ - {_id: 1, x: 11}
47
+ - {_id: 2, x: 22}
48
+ - {_id: 3, x: 33}
49
+ - {_id: 4, x: 44}
50
+
@@ -0,0 +1,36 @@
1
+ data:
2
+ - {_id: 1, x: 11}
3
+ - {_id: 2, x: 22}
4
+ - {_id: 3, x: 33}
5
+
6
+ tests:
7
+ -
8
+ description: "DeleteMany when many documents match"
9
+ operation:
10
+ name: "deleteMany"
11
+ arguments:
12
+ filter:
13
+ _id: {$gt: 1}
14
+
15
+ outcome:
16
+ result:
17
+ deletedCount: 2
18
+ collection:
19
+ data:
20
+ - {_id: 1, x: 11}
21
+ -
22
+ description: "DeleteMany when no document matches"
23
+ operation:
24
+ name: "deleteMany"
25
+ arguments:
26
+ filter: {_id: 4}
27
+
28
+ outcome:
29
+ result:
30
+ deletedCount: 0
31
+ collection:
32
+ data:
33
+ - {_id: 1, x: 11}
34
+ - {_id: 2, x: 22}
35
+ - {_id: 3, x: 33}
36
+
@@ -0,0 +1,49 @@
1
+ data:
2
+ - {_id: 1, x: 11}
3
+ - {_id: 2, x: 22}
4
+ - {_id: 3, x: 33}
5
+
6
+ tests:
7
+ -
8
+ description: "DeleteOne when many documents match"
9
+ operation:
10
+ name: "deleteOne"
11
+ arguments:
12
+ filter:
13
+ _id: {$gt: 1}
14
+
15
+ outcome:
16
+ result:
17
+ deletedCount: 1
18
+ # can't verify collection because we don't have a way
19
+ # of knowing which document gets deleted.
20
+ -
21
+ description: "DeleteOne when one document matches"
22
+ operation:
23
+ name: "deleteOne"
24
+ arguments:
25
+ filter: {_id: 2}
26
+
27
+ outcome:
28
+ result:
29
+ deletedCount: 1
30
+ collection:
31
+ data:
32
+ - {_id: 1, x: 11}
33
+ - {_id: 3, x: 33}
34
+ -
35
+ description: "DeleteOne when no documents match"
36
+ operation:
37
+ name: "deleteOne"
38
+ arguments:
39
+ filter: {_id: 4}
40
+
41
+ outcome:
42
+ result:
43
+ deletedCount: 0
44
+ collection:
45
+ data:
46
+ - {_id: 1, x: 11}
47
+ - {_id: 2, x: 22}
48
+ - {_id: 3, x: 33}
49
+
@@ -0,0 +1,54 @@
1
+ data:
2
+ - {_id: 1, x: 11}
3
+ - {_id: 2, x: 22}
4
+ - {_id: 3, x: 33}
5
+
6
+ tests:
7
+ -
8
+ description: "FindOneAndDelete when many documents match"
9
+ operation:
10
+ name: findOneAndDelete
11
+ arguments:
12
+ filter:
13
+ _id: {$gt: 1}
14
+ projection: {x: 1, _id: 0}
15
+ sort: {x: 1}
16
+
17
+ outcome:
18
+ result: {x: 22}
19
+ collection:
20
+ data:
21
+ - {_id: 1, x: 11}
22
+ - {_id: 3, x: 33}
23
+ -
24
+ description: "FindOneAndDelete when one document matches"
25
+ operation:
26
+ name: findOneAndDelete
27
+ arguments:
28
+ filter: {_id: 2}
29
+ projection: {x: 1, _id: 0}
30
+ sort: {x: 1}
31
+
32
+ outcome:
33
+ result: {x: 22}
34
+ collection:
35
+ data:
36
+ - {_id: 1, x: 11}
37
+ - {_id: 3, x: 33}
38
+ -
39
+ description: "FindOneAndDelete when no documents match"
40
+ operation:
41
+ name: findOneAndDelete
42
+ arguments:
43
+ filter: {_id: 4}
44
+ projection: {x: 1, _id: 0}
45
+ sort: {x: 1}
46
+
47
+ outcome:
48
+ result: null
49
+ collection:
50
+ data:
51
+ - {_id: 1, x: 11}
52
+ - {_id: 2, x: 22}
53
+ - {_id: 3, x: 33}
54
+
@@ -0,0 +1,153 @@
1
+ data:
2
+ - {_id: 1, x: 11}
3
+ - {_id: 2, x: 22}
4
+ - {_id: 3, x: 33}
5
+
6
+ tests:
7
+ -
8
+ description: "FindOneAndReplace when many documents match returning the document before modification"
9
+ operation:
10
+ name: findOneAndReplace
11
+ arguments:
12
+ filter:
13
+ _id: {$gt: 1}
14
+ replacement: {x: 32}
15
+ projection: {x: 1, _id: 0}
16
+ sort: {x: 1}
17
+
18
+ outcome:
19
+ result: {x: 22}
20
+ collection:
21
+ data:
22
+ - {_id: 1, x: 11}
23
+ - {_id: 2, x: 32}
24
+ - {_id: 3, x: 33}
25
+ -
26
+ description: "FindOneAndReplace when many documents match returning the document after modification"
27
+ operation:
28
+ name: findOneAndReplace
29
+ arguments:
30
+ filter:
31
+ _id: {$gt: 1}
32
+ replacement: {x: 32}
33
+ projection: {x: 1, _id: 0}
34
+ returnDocument: After
35
+ sort: {x: 1}
36
+
37
+ outcome:
38
+ result: {x: 32}
39
+ collection:
40
+ data:
41
+ - {_id: 1, x: 11}
42
+ - {_id: 2, x: 32}
43
+ - {_id: 3, x: 33}
44
+ -
45
+ description: "FindOneAndReplace when one document matches returning the document before modification"
46
+ operation:
47
+ name: findOneAndReplace
48
+ arguments:
49
+ filter: {_id: 2}
50
+ replacement: {x: 32}
51
+ projection: {x: 1, _id: 0}
52
+ sort: {x: 1}
53
+
54
+ outcome:
55
+ result: {x: 22}
56
+ collection:
57
+ data:
58
+ - {_id: 1, x: 11}
59
+ - {_id: 2, x: 32}
60
+ - {_id: 3, x: 33}
61
+ -
62
+ description: "FindOneAndReplace when one document matches returning the document after modification"
63
+ operation:
64
+ name: findOneAndReplace
65
+ arguments:
66
+ filter: {_id: 2}
67
+ replacement: {x: 32}
68
+ projection: {x: 1, _id: 0}
69
+ returnDocument: After
70
+ sort: {x: 1}
71
+
72
+ outcome:
73
+ result: {x: 32}
74
+ collection:
75
+ data:
76
+ - {_id: 1, x: 11}
77
+ - {_id: 2, x: 32}
78
+ - {_id: 3, x: 33}
79
+ -
80
+ description: "FindOneAndReplace when no documents match returning the document before modification"
81
+ operation:
82
+ name: findOneAndReplace
83
+ arguments:
84
+ filter: {_id: 4}
85
+ replacement: {x: 44}
86
+ projection: {x: 1, _id: 0}
87
+ sort: {x: 1}
88
+
89
+ outcome:
90
+ result: null
91
+ collection:
92
+ data:
93
+ - {_id: 1, x: 11}
94
+ - {_id: 2, x: 22}
95
+ - {_id: 3, x: 33}
96
+ -
97
+ description: "FindOneAndReplace when no documents match with upsert returning the document before modification"
98
+ operation:
99
+ name: findOneAndReplace
100
+ arguments:
101
+ filter: {_id: 4}
102
+ replacement: {x: 44}
103
+ projection: {x: 1, _id: 0}
104
+ sort: {x: 1}
105
+ upsert: true
106
+
107
+ outcome:
108
+ result: null
109
+ collection:
110
+ data:
111
+ - {_id: 1, x: 11}
112
+ - {_id: 2, x: 22}
113
+ - {_id: 3, x: 33}
114
+ - {_id: 4, x: 44}
115
+ -
116
+ description: "FindOneAndReplace when no documents match returning the document after modification"
117
+ operation:
118
+ name: findOneAndReplace
119
+ arguments:
120
+ filter: {_id: 4}
121
+ replacement: {x: 44}
122
+ projection: {x: 1, _id: 0}
123
+ returnDocument: After
124
+ sort: {x: 1}
125
+
126
+ outcome:
127
+ result: null
128
+ collection:
129
+ data:
130
+ - {_id: 1, x: 11}
131
+ - {_id: 2, x: 22}
132
+ - {_id: 3, x: 33}
133
+ -
134
+ description: "FindOneAndReplace when no documents match with upsert returning the document after modification"
135
+ operation:
136
+ name: findOneAndReplace
137
+ arguments:
138
+ filter: {_id: 4}
139
+ replacement: {x: 44}
140
+ projection: {x: 1, _id: 0}
141
+ returnDocument: After
142
+ sort: {x: 1}
143
+ upsert: true
144
+
145
+ outcome:
146
+ result: {x: 44}
147
+ collection:
148
+ data:
149
+ - {_id: 1, x: 11}
150
+ - {_id: 2, x: 22}
151
+ - {_id: 3, x: 33}
152
+ - {_id: 4, x: 44}
153
+