You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							151 lines
						
					
					
						
							6.0 KiB
						
					
					
				
			
		
		
	
	
							151 lines
						
					
					
						
							6.0 KiB
						
					
					
				| "use strict";
 | |
| Object.defineProperty(exports, "__esModule", { value: true });
 | |
| exports.FindOneAndUpdateOperation = exports.FindOneAndReplaceOperation = exports.FindOneAndDeleteOperation = exports.ReturnDocument = void 0;
 | |
| const error_1 = require("../error");
 | |
| const read_preference_1 = require("../read_preference");
 | |
| const sort_1 = require("../sort");
 | |
| const utils_1 = require("../utils");
 | |
| const command_1 = require("./command");
 | |
| const operation_1 = require("./operation");
 | |
| /** @public */
 | |
| exports.ReturnDocument = Object.freeze({
 | |
|     BEFORE: 'before',
 | |
|     AFTER: 'after'
 | |
| });
 | |
| function configureFindAndModifyCmdBaseUpdateOpts(cmdBase, options) {
 | |
|     cmdBase.new = options.returnDocument === exports.ReturnDocument.AFTER;
 | |
|     cmdBase.upsert = options.upsert === true;
 | |
|     if (options.bypassDocumentValidation === true) {
 | |
|         cmdBase.bypassDocumentValidation = options.bypassDocumentValidation;
 | |
|     }
 | |
|     return cmdBase;
 | |
| }
 | |
| /** @internal */
 | |
| class FindAndModifyOperation extends command_1.CommandOperation {
 | |
|     constructor(collection, query, options) {
 | |
|         super(collection, options);
 | |
|         this.options = options ?? {};
 | |
|         this.cmdBase = {
 | |
|             remove: false,
 | |
|             new: false,
 | |
|             upsert: false
 | |
|         };
 | |
|         const sort = (0, sort_1.formatSort)(options.sort);
 | |
|         if (sort) {
 | |
|             this.cmdBase.sort = sort;
 | |
|         }
 | |
|         if (options.projection) {
 | |
|             this.cmdBase.fields = options.projection;
 | |
|         }
 | |
|         if (options.maxTimeMS) {
 | |
|             this.cmdBase.maxTimeMS = options.maxTimeMS;
 | |
|         }
 | |
|         // Decorate the findAndModify command with the write Concern
 | |
|         if (options.writeConcern) {
 | |
|             this.cmdBase.writeConcern = options.writeConcern;
 | |
|         }
 | |
|         if (options.let) {
 | |
|             this.cmdBase.let = options.let;
 | |
|         }
 | |
|         // we check for undefined specifically here to allow falsy values
 | |
|         // eslint-disable-next-line no-restricted-syntax
 | |
|         if (options.comment !== undefined) {
 | |
|             this.cmdBase.comment = options.comment;
 | |
|         }
 | |
|         // force primary read preference
 | |
|         this.readPreference = read_preference_1.ReadPreference.primary;
 | |
|         this.collection = collection;
 | |
|         this.query = query;
 | |
|     }
 | |
|     execute(server, session, callback) {
 | |
|         const coll = this.collection;
 | |
|         const query = this.query;
 | |
|         const options = { ...this.options, ...this.bsonOptions };
 | |
|         // Create findAndModify command object
 | |
|         const cmd = {
 | |
|             findAndModify: coll.collectionName,
 | |
|             query: query,
 | |
|             ...this.cmdBase
 | |
|         };
 | |
|         // Have we specified collation
 | |
|         try {
 | |
|             (0, utils_1.decorateWithCollation)(cmd, coll, options);
 | |
|         }
 | |
|         catch (err) {
 | |
|             return callback(err);
 | |
|         }
 | |
|         if (options.hint) {
 | |
|             // TODO: once this method becomes a CommandOperation we will have the server
 | |
|             // in place to check.
 | |
|             const unacknowledgedWrite = this.writeConcern?.w === 0;
 | |
|             if (unacknowledgedWrite || (0, utils_1.maxWireVersion)(server) < 8) {
 | |
|                 callback(new error_1.MongoCompatibilityError('The current topology does not support a hint on findAndModify commands'));
 | |
|                 return;
 | |
|             }
 | |
|             cmd.hint = options.hint;
 | |
|         }
 | |
|         // Execute the command
 | |
|         super.executeCommand(server, session, cmd, (err, result) => {
 | |
|             if (err)
 | |
|                 return callback(err);
 | |
|             return callback(undefined, result);
 | |
|         });
 | |
|     }
 | |
| }
 | |
| /** @internal */
 | |
| class FindOneAndDeleteOperation extends FindAndModifyOperation {
 | |
|     constructor(collection, filter, options) {
 | |
|         // Basic validation
 | |
|         if (filter == null || typeof filter !== 'object') {
 | |
|             throw new error_1.MongoInvalidArgumentError('Argument "filter" must be an object');
 | |
|         }
 | |
|         super(collection, filter, options);
 | |
|         this.cmdBase.remove = true;
 | |
|     }
 | |
| }
 | |
| exports.FindOneAndDeleteOperation = FindOneAndDeleteOperation;
 | |
| /** @internal */
 | |
| class FindOneAndReplaceOperation extends FindAndModifyOperation {
 | |
|     constructor(collection, filter, replacement, options) {
 | |
|         if (filter == null || typeof filter !== 'object') {
 | |
|             throw new error_1.MongoInvalidArgumentError('Argument "filter" must be an object');
 | |
|         }
 | |
|         if (replacement == null || typeof replacement !== 'object') {
 | |
|             throw new error_1.MongoInvalidArgumentError('Argument "replacement" must be an object');
 | |
|         }
 | |
|         if ((0, utils_1.hasAtomicOperators)(replacement)) {
 | |
|             throw new error_1.MongoInvalidArgumentError('Replacement document must not contain atomic operators');
 | |
|         }
 | |
|         super(collection, filter, options);
 | |
|         this.cmdBase.update = replacement;
 | |
|         configureFindAndModifyCmdBaseUpdateOpts(this.cmdBase, options);
 | |
|     }
 | |
| }
 | |
| exports.FindOneAndReplaceOperation = FindOneAndReplaceOperation;
 | |
| /** @internal */
 | |
| class FindOneAndUpdateOperation extends FindAndModifyOperation {
 | |
|     constructor(collection, filter, update, options) {
 | |
|         if (filter == null || typeof filter !== 'object') {
 | |
|             throw new error_1.MongoInvalidArgumentError('Argument "filter" must be an object');
 | |
|         }
 | |
|         if (update == null || typeof update !== 'object') {
 | |
|             throw new error_1.MongoInvalidArgumentError('Argument "update" must be an object');
 | |
|         }
 | |
|         if (!(0, utils_1.hasAtomicOperators)(update)) {
 | |
|             throw new error_1.MongoInvalidArgumentError('Update document requires atomic operators');
 | |
|         }
 | |
|         super(collection, filter, options);
 | |
|         this.cmdBase.update = update;
 | |
|         configureFindAndModifyCmdBaseUpdateOpts(this.cmdBase, options);
 | |
|         if (options.arrayFilters) {
 | |
|             this.cmdBase.arrayFilters = options.arrayFilters;
 | |
|         }
 | |
|     }
 | |
| }
 | |
| exports.FindOneAndUpdateOperation = FindOneAndUpdateOperation;
 | |
| (0, operation_1.defineAspects)(FindAndModifyOperation, [
 | |
|     operation_1.Aspect.WRITE_OPERATION,
 | |
|     operation_1.Aspect.RETRYABLE,
 | |
|     operation_1.Aspect.EXPLAINABLE
 | |
| ]);
 | |
| //# sourceMappingURL=find_and_modify.js.map
 |